指针与数组的区别

    技术2022-05-19  55

    指针和数组的一个不同,是在空间上分配的不同,下面测试程序分别定义了全局指针变量,全局数组变量,局部指针变量,局部数组变量:

    引用 #include <stdio.h> char *p = "hello"; char b [] = "LINUX-WORLD"; int main() {         char * p1 = "world";         char a [] = "linux-wrold";         printf ( "%s /n " , p);         printf ( "%s /n " , p1);         return 0; }

    编译生成可执行文件后,用 objdump 看一下,这些用来初始化指针和数组的字符串都放在哪里:

    引用 Contents of section .rodata:  8048528 03000000 01000200 68656c6c 6f00776f  ........hello.wo  8048538 726c6400                             rld.          

    可见,不管是全局指针变量,还是局部指针变量,都会放在 .rodata section 里。.rodata 是只读的常量段,所以放在这里的字符串是无法更改的,也就是说,试图更改这些字符串会发生错误。对于全局数组 b:

    引用 Contents of section .data:  804a00c 00000000 00000000 30850408 4c494e55  ........0...LINU  804a01c 582d574f 524c4400                    X-WORLD.       

    可见,初始化内容放在 .data section 里。.data 段是数据段,它用来存放初始化了的全局变量,初始化了的静态变量,这里的内容可读可写。对于局部数组 a :

    引用 Contents of section .text: ... ...  8048420 e55183ec 14c745f8 36850408 c745ec6c  .Q....E.6....E. l  8048430 696e75c7 45f0782d 7772c745 f46f6c64  inu.E. x-wr.E. old ... ...

    局部数组 a ,放在代码段,代码断用来存放程序代码。这里的数据一经编译好,就会确定下来。相关段含义:http://www.groad.net/bbs/read.php?tid-1161.html


    不能直接用 &a 的方式赋值到一个指针的指针中去,如:

    引用 char **q = &a;

    因为,数组名本身就是一个“明确”的地址,而不是一个变量,一个变量通过 & 符号可以取得自己的地址,但一个明确的地址,再用 & 时,就不知道取何值。但是可以间接的通过一个指针来过渡:

    引用 #include <stdio.h> int main() {         char a [] = "linux-world";         char *p = a;         char ** q = &p;         printf ( "%c /n " , ** q);         printf ( "%s /n " , * q);         return 0; }

    运行及输出:

    引用 beyes@linux-beyes:~/C/exam> ./point_and_array.exe l linux-world

    最新回复(0)