数组与指针,是一个比较容易让人迷惑的地方,最主要就是各种不同的表示方式所代表的不同的含义,下面我们一步步来理解一下不同的方式:
1) 定义方式:
int a[5]; // a 其实是一个常量指针,指向数组的第一个元素 a[0] int *p = a; // 等效于:int *p = &a[0];2) 通过指针引用数组元素
int a[5] = {10,20,30,40,50}; int *p = a; // 或 int *p = &a[0]; printf("the seconde elem is %d \n",a[1]);//20 printf("the seconde elem is %d \n",*(a+1));//20 printf("the seconde elem is %d \n",p[1]);//20 printf("the seconde elem is %d \n",*(p+1));//20类似地推算,我们可以知道:a[i] 等同于 *(a+i),当中 a[0] 等同于 *a 或 *(a+0);*(p+i) 等同于 ptr[i]。看过一些书,会有着这样一种介绍 * 和 [] 等同,,结合前面的例子,我们再看另外一个例子:
int a[5] = {10,20,30,40,50}; int *p = a; // 或 int *p = &a[0]; printf("the seconde elem is %d \n",a[1]+1);//21 printf("the seconde elem is %d \n",*a+1);//11,可以看成 (*a)+1 或 *(a+0)+1 printf("the seconde elem is %d \n",p[1]+1);//21 printf("the seconde elem is %d \n",*p+1);//11,可以看成 (*p)+1 或 *(p+0)+1是不是觉得我们基本可以了解这些使用了,我们再深入地学习一下,当 * 与 ++ 或 —— 相遇时,又会是一种什么样的情况:
// 第一种情况 int a[5] = {10,20,30,40,50}; int *p = a; // 或 int *p = &a[0]; printf("*p++ = %d \n",*p++); // 10,可以看成是 *(p++) // 第二种情况: int a[5] = {10,20,30,40,50}; int *p = a; // 或 int *p = &a[0]; printf("*++p = %d \n",*++p); //20,可以看成 *(++p) // 第三种情况 int a[5] = {10,20,30,40,50}; int *p = a; // 或 int *p = &a[0]; printf("++*p = %d \n",++*p); // 11,可以看成 ++(*p)* 与 ++ 或 -- 的运算符优先级相同,结合性是由右往左。如果觉得基本都懂的,那猜猜一下下面这个例子会输出什么?
int a[5] = {10,20,30,40,50}; int *p = a; // 或 int *p = &a[0]; printf("*p++ = %d \n",*p++); printf("*++p = %d \n",*++p); printf("++*p = %d \n",++*p);现在的我们可以来总结一下:
当 p = &a[i] 时,则有:
*p++ 相当于 a[i++];
*++p 相当于 a[++i];
*p-- 相当于 a[i--];
*—p 相当于 a[—i];