第29课 指针和数组分析(下)

Posted wanmeishenghuo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第29课 指针和数组分析(下)相关的知识,希望对你有一定的参考价值。

数组名可以当做常量指针使用,那么指针是否也可以当做数组名来使用呢?

技术分享图片

 

下标VS指针形式:

技术分享图片

 

示例程序:

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     int a[5] = {0};
 6     int* p = a;
 7     int i = 0;
 8     
 9     for(i=0; i<5; i++)
10     {
11         p[i] = i + 1;
12     }
13     
14     for(i=0; i<5; i++)
15     {
16         printf("a[%d] = %d
", i, *(a + i));
17     }
18     
19     printf("
");
20     
21     for(i=0; i<5; i++)
22     {
23         i[a] = i + 10;
24     }
25     
26     for(i=0; i<5; i++)
27     {
28         printf("p[%d] = %d
", i, p[i]);
29     }
30     
31     return 0;
32 }

第11行将指针当做数组名来使用。

运行结果如下:

技术分享图片

 

可以看到输出结果是正确的。

但是数组和指针是不同的。

示例程序:

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     extern int* a;
 6     
 7     printf("&a = %p
", &a);
 8     printf("a = %p
", a);
 9     printf("*a = %d
", *a);
10 
11     
12     return 0;
13 }

ext.c文件

1 int a[] = {1, 2, 3, 4, 5};

当上述程序第5行为extern int a[];时,编译运行结果如下:

技术分享图片

 

当第5行改为extern int *a;时,结果如下:

技术分享图片

 

出现了段错误。

当编译ext.c的时候,在内存中出现了如下的情况,编译器在内存中分配20个字节:

技术分享图片

 

  编译器编译ext.c,分配了内存,给了a一个地址0x804a014。编译器将a这个标识符映射到了0x804a014这个地址值上面。在内存中是没有变量和标识符的,只有地址。

  编译器在编译到主程序的第5行时,看到a是在外部定义的,那么就认为在外部,编译器已经给了它一个地址值了,第7行取a的地址值,自然得到了0x804a014。

  编译到第8行时,a被解释为指针,a这个变量在编译器中分配的地址为0x804a014,这个地址其实对程序员是不可见的。而a的值并不是这个地址,而是这个地址中存放的值,因此,编译器会到0x804a014这个地址里面取四个字节,这四个字节就是a的值。

 

以上是关于第29课 指针和数组分析(下)的主要内容,如果未能解决你的问题,请参考以下文章

第28课 指针和数组分析(上)

指针和数组分析(下)

指针和数组分析(上)

第36课 函数与指针分析

第32课 数组指针和指针数组分析

第41课 内存操作经典问题分析一