指针变量的用途:
指针变量只可以进行赋值运算和部分算术运算及关系运算
指针运算符:
1) 取地址运算符&:单目运算符,结合性为自右向左,其功能是取变量的地址。在scanf函数及指针变量赋值中应用
2) 解参考运算符*:单目运算符,其结合性为自右向左,其功能表示指针变量所指的变量。在运算符之后跟的变量必须是指针变量
注意:指针运算符*和解参考运算符*不同。前者中,“*”是类型说明符,表示其后的变量是指针类型,而表达式中出现的“*”则是一个运算符用以表示指针变量所值的变量,比如:
# include <stdio.h> int main() return 0; |
指针变量p取得了整型变量a的地址,而printf (\"%d\\n\", *p);输出变量a的值
指针变量的运算:
1) 赋值运算:
指针变量初始化赋值
把一个变量的地址赋予指向相同数据类型的指针变量:
int a, *pa;
pa = &a;
把一个指针变量的值赋予指向相同类型变量的另一个指针变量:
int a, *pa = &a, *pb;
pb = pa; /*把a的地址赋予指针变量pb*/
把数组的首地址赋予指向数组的指针变量:
int a[5], *pa;
pa = a;
把字符串的首地址赋予指向字符类型的指针变量:
char *Ptr;
Ptr = \"I love you!\";
把函数的入口地址赋予指向函数的指针变量:
int (*pf)();
pf = f; /*f为函数名*/
2) 加减算术运算:
指针变量加减一个整数n的意义是把指针指向的当前位置(某数组)向前或向后移动n个位置:
int a[5], *pa;
pa = a; /*pa指向数组a,也就是指向a[0]*/
pa = pa + 2; /*pa指向a[2],即pa的值为&pa[2]*/
指针变量的加减运算只有对数组执行时才有意义
3) 两个指针变量之间的运算:
只有指向同一数组的两个指针变量之间才能进行运算:
两指针相减所得之差是两个指针所指数组元素之间相差的元素个数:
pf1的值为2010H,pf2的值为2000H,浮点数组每个元素占4个字节,pf1-pf2的结果为(2010H-2000H)/4=4
指针加法无任何意义
指向同一数组的两指针变量进行关系运算可表示它们所值数组元素之间的关系:
pf1==pf2:pf1和pf2指向同一数组元素;
pf1>pf2:pf1处于高地址位置;
pf1<pf2:pf2处于低地址位置。
指针变量与0比较:
设p为指针变量则
p==0:p是空指针,它不指向任何变量
p!=0:p不是空指针
空指针是由对指针变量赋予0值而得到的:
#define NULL 0
int *p=NULL;
对指针变量赋0值和不赋0值不同的。指针变量为赋值时,可以是任意值,是不能使用的。否则将造成以外错误。而指针变量赋0值后,则可以使用,只是它不指向具体的变量而已