指针和数组要深入理解


Posted on November 28, 2013


一直忙于干活,很多知识都遗忘了,遇到一段代码,发现自己的基础太令人捉急了,代码类似于:

main()
{
    int a[5] = {1, 2, 3, 4, 5};
    int *ptr = (int *)(&a + 1);
    printf("%d %d" , *(a + 1), *(ptr - 1));
}

结果应该是2 5,原因在于(int*)(&a+1)这里。


2013/12/10 22:51 update:

指针和数据很多时候混用,但不代表两者相同,另外,很重要的一点,如果一个数组声明为指针时,定为成数组时,如下:

extern int *a;//声明

int a[0] = {0,1};//定义

在使用extern的文件中,若使用a[0]的方式来访问,就会出现错误,原因是编译以声明作为编译的依据,定义可以看作是一种特殊的声明,是分配内存,甚至初始化的功能。用指针去访问数组,存在二次寻址的过程,但是例子中的指针a并不存在一个额外的内存地址用来存放指针变量,所以编译器会把a[0]翻译为,先从a的内容中取内容0,再去寻找存放在地址0内的内容,这显然是不正确的,找不到地址为0的内存。


标签:N/A

 

在线学习答案查询入口
微信扫一扫
微信扫码联系