C语言指针的相关概念(2)

    数组与指针,是一个比较容易让人迷惑的地方,最主要就是各种不同的表示方式所代表的不同的含义,下面我们一步步来理解一下不同的方式:

  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];

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/2cd3077b468c7c179873ad1d5a433856.html