关于数组和指针的一道例题的解读
2017-11-20 21:38
274 查看
#include <stdio.h> int main(int argc, char *argv[]) { int a[3]={1,2,3}; int (*pa)[3]; // *pa=a; //错误,因为pa没有被赋值,怎么取值,语法错误。 pa=&a; //正确,&a为指向数组的地址,和pa类型匹配 printf("*pa=%p\n",*pa); //正确,*pa含义为:对pa解引用,得到数组a的地址。 printf("*pa+1=%p\n",*pa+1); //正确,*pa+1:先计算*pa(相当于数组名,默认被编译器自动转换为数组>首元素首地址)得到数组首元素地址,然后加1,移动4个字节 printf("*(pa+1)=%p\n",*(pa+1)); //正确,*(pa+1):先计算(pa+1),因为pa为数组首地址(注意不是数组首 元素地址)类型是整个数组,所以(pa+1)移动了整个数组的字节数,也就是12个字节。 printf("&*pa=%p\n",&*pa);//正确,由这个可以看出(*pa)被编译器看作是数组名,因为对数组名取地址得>到的指针类型是整个数组结构。 printf("&*pa+1=%p\n",&*pa+1);//结果是移动了12个字节,表明(&*pa)为指向数组的指针。 // *pa=a; //错误,因为(*pa)为数组a的地址,是一个地址直接量,不可以改变。 // *pa=&a; //error // *pa=&a[0]; //error // *pa=*pa+1; //错误,同理(*pa)为一个地址直接量,不是左值,不能进行自加运算。 *pa++; //正确,自加的是pa不是(*pa),不信你可以试试:(*pa)++ printf("*pa=%p\n",*pa); return 0; }
相关文章推荐
- 一道关于返回指针和返回数组名的面试题
- 关于字符串和指针的一道小例题
- 关于C数组指针的一道面试题
- 一道关于二维数组和指针数组的C语言笔试题目
- C/C++拾遗(一):关于数组的指针和数组元素首地址的一道经典题
- 关于数组指针的一道面试题
- 关于指针与数组的相关例题详解
- 关于数组指针的一道面试题
- 一道关于返回指针和返回数组名的面试题
- C/C++拾遗(一):关于数组的指针和数组元素首地址的一道经典题
- C/C++拾遗:关于数组的指针和数组元素首地址的一道经典题
- C/C++ 关于数组的指针和数组元素首地址的一道经典题
- 关于字符数组的指针移动操作
- 关于指针数组的声明
- 关于 指针 和数组。
- 关于函数指针数组与返回数组指针的函数
- 关于一道数据库例题的解析。为什么σ age>22 (πS_ID,SCORE (SC) ) 选项是错的?
- 关于C语言字符数组、字符串和指针的相关问题
- 关于C语言声明、指针、数组、函数、typedef等等的一通“超级扯”
- 关于一维数组、二维数组、一级指针、二级指针、指针数组、数组指针、空指针、字符指针、const的个人理解