相减:
两个指针可以相减,相减的结果的类型是ptrdiff_t(这个是一个有符号整数类型)。
相减的结果:数组元素的长度为单位,而不是以字节为单位。
两个指针必须都指向同一个数组中的某个元素。
1 typedef struct { 2 int a; 3 int b; 4 int c; 5 int d; 6 } my_struct; 7 8 my_struct my_arrary[2] = { 9 {1, 2, 3, 4}, 10 {10, 20, 30, 40} 11 }; 12 13 my_struct *my_pointer_1 = &my_arrary[0]; 14 my_struct *my_pointer_2 = &my_arrary[1]; 15 16 printf("my_pointer_2 - my_pointer_1 = %d ",my_pointer_2 - my_pointer_1); 17 printf("my_pointer_1 - my_pointer_2 = %d ",my_pointer_1 - my_pointer_2); 18 19 Output : 20 my_pointer_2 - my_pointer_1 = 1 21 my_pointer_1 - my_pointer_2 = -1
比较:< , <= , > , >=
可以比较两个指针,但前提条件是这两个指针都必须指向同一个数组的某个元素 或者 指向数组最后一个元素后面一个内存。
比如:
int array[3];
int *p1 = &array[0];
int *p2 = p1 + 3;
int *p3 = p1 - 1;
p3 < p2:非法
p2 > p1:合法
指针+/-整数:
*与++
1 char array[5] = {0, 1, 2, 3, 4}; 2 char *pointer = &array[0]; 3 4 printf("*pointer++ : %d ", *pointer++); 5 printf("*pointer++ : %d ", *pointer++);
第4行的打印是0还是1呢?结果是0 。由于++的优先级高于*,所以很容易搞混结果。
解释:这个结果是分3步。
- ++操作符产生一个pointer的副本
- 然后++操作符增加pointer的值
- 在pointer的副本上执行间接访问操作
Output :
*pointer++ : 0
*pointer++ : 1