第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课 指针和数组分析(下)的主要内容,如果未能解决你的问题,请参考以下文章