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

2021-07-14 10:05

阅读:577

标签:常量   .com   技术分享   情况   分享图片   alt   外部   解释   clu   

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

技术分享图片

 

下标VS指针形式:

技术分享图片

 

示例程序:

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

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

运行结果如下:

技术分享图片

 

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

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

示例程序:

 1 #include  2 
 3 int main()
 4 {
 5     extern int* a;
 6     
 7     printf("&a = %p\n", &a);
 8     printf("a = %p\n", a);
 9     printf("*a = %d\n", *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课 指针和数组分析(下)

标签:常量   .com   技术分享   情况   分享图片   alt   外部   解释   clu   

原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9538862.html


评论


亲,登录后才可以留言!