指针和变量的关系
指针存放变量的地址;
int a;
int *p;
p = &a; //指向一个地址
指针变量 等价于指针指向的变量(存放一个已经分配空间的地址):
例如:
int a;
int *p=&a; //a已经分配了空间
对应类型的指针只能保存对应类型数据的地址:
如果想让不同类型的指针互相赋值的时候,需要强制转换
int a=0x1234,b=0x5678;
char *p1,*p2;
p1 = (char *)&a;
p2 = (char *)&b;
printf("%#x, %#x\n", *p1, *p2); //0x34 0x78
p1++;
p2++;
printf("%#x, %#x\n", *p1, *p2); //0x12 0x56
指针的运算
指针可以加一个整数,往下指几个它指向的变量,结果还是个地址
前提:指针指向数组的时候,加一个整数才有意义
int a[10];
int *p;
p=a;
p+2; //p是a[0]的地址,p+2 是a[2]的地址,&a[2]
两个相同类型的指针可以比较大小
前提:只有两个相同类型的指针指向同一个数组的元素的时候,比较大小才有意义。
指向前面元素的指针小于指向后面元素的指针。
两个相同类型的指针可以相互做减法
前提:只有两个相同类型的指针指向同一个数组的元素的时候,做减法才有意义。
做减法的意义是:两个指针指向的中间有多少个元素
int a[10];
int *P = &a[0];
int *q = &a[3];
printf("%d\n", q-p); // 3 , 间隔3个元素
两个相同类型的指针可以相互赋值
注意:只有相同类型的指针才可以相互赋值(void *类型的除外)
int *p;
int *q;
int a;
p=&a; //p保存a的地址,p指向变量a
q=p; //用p给q赋值,q也保存了a的地址,指向a;
注意:如果类型不相同的指针要想相互赋值,必须经过强制类型转换。