指针之间只支持减法运算,参与减法运算的指针类型必须相等
注:1,只有当两个指针都指向同一个数组中的元素是,指针相减才有意义,其意义为:指针所指元素的下标差
2,当两个指针指向的元素不在同一个数组中时,结果未定义
char s1[] = {'H', 'e', 'l', 'l', 'o'}; int i = 0; char s2[] = {'W', 'o', 'r', 'l', 'd'}; char* p0 = s1; char* p1 = &s1[3]; char* p2 = s2; int* p = &i; printf("%d\n", p0 - p1);--------》-3
指针也可以进行关系运算(> < == !=)必须是同类型的;
指针运算规则:p+n <------> (unsigned int)p+n*sizeof(*p);
char s[] = {'H', 'e', 'l', 'l', 'o'}; char* pBegin = s; char* pEnd = s + DIM(s); // Key point char* p = NULL; printf("pBegin = %p\n", pBegin); printf("pEnd = %p\n", pEnd); printf("Size: %d\n", pEnd - pBegin); for(p=pBegin; p<pEnd; p++) { printf("%c", *p); }
下标形式 和 指针形式
a[ n ] <--> *( a + n )<--> * ( n + a ) <--> n[ a ]
a 和 & a 的区别:
a+1-------> (unsigned int) a + sizeof(* a)
& a +1-------->(unsigned int)(&a ) + sizeof(* & a)--------->(unsigned int)(&a)+sizeof( a )
int a[5] = {1, 2, 3, 4, 5}; int* p1 = (int*)(&a + 1); int* p2 = (int*)((int)a + 1); int* p3 = (int*)(a + 1); printf("%d, %d, %d\n", *p1, *p2, *p3); printf("%d, %d, %d\n", p1[-5], p2[0], p3[1]); // B. p1[-1]将输出5,p2[0]输出随机数, p3[1]输出3
数组作为函数参数时,编译器将其编译成对应的指针------->所以有了虚幻函数参数这么一说(一般,当定义的函数中有数组参数时,需要定义另一个参数来标识数组的大小)