曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 5445|回复: 0
打印 上一主题 下一主题

指针与数组的区别

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2009-9-8 11:48:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
指针和数组的一个不同,是在空间上分配的不同,下面测试程序分别定义了全局指针变量,全局数组变量,局部指针变量,局部数组变量:
#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;
如果数组名前加一个 & 符号,它的地址虽然和数组的地址一样,但类型却不一样了 -- 这样做后,类型是一个数组的指针,而不是 char 指针的指针。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-10 23:04 , Processed in 0.072412 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表