数组和指针的区别

来源:互联网 发布:纯爱社区更改域名 编辑:程序博客网 时间:2024/05/17 20:36

数组和指针的区别

 

 

数组和指针其实并不相同,数组引用是直接寻址,指针方式引用是间接寻址。在同一文件中使用时看不出来,在不同文件中使用就可以看出来了。
第一种情况:
file1.c
char p[]="Hello every one";
file2.c
extern char *p;
定义了数组 p, 编译器为这个数组分配了内存来放这个数组,并记下这个内存的地址和符号表中的 p 对应
p -> 0x10000000  并且把从 0x10000000 开始的内容写为 48 65 6c 6c 6f ...
按指针来访问的时候,首先取出符号 p 对应的地址 0x10000000,然后在这个地址上取出四个字节作为指针指向的地址,这时得到的是 0x6c6c6548, 显然这个地址并没有被分配过,除非其它某个地方恰好使用了这个内存,否则访问就会出错。
第二中情况:
file1.c
char *p;
.......
p=(char *)malloc(20*sizeof(char));
.......
file2.c
extern char p[];
定义的是一个指针,编译器首先为 p 分配四个字节的内存,比如地址是 0x20000000 - 0x20000003 来存放一个地址。然后在符号表中  p -> 0x20000000.
p = (char*)malloc(...) 的时候,比如 malloc 分配得到的地址是 0x3000000, 运行的时候就会把 0x20000000 - 0x20000003 的内存内容改为 00 00 00 30, 在 0x3000000 中是字符串内容。
把 p 按数组来访问的时候,编译器首先找到 p 对应的地址 0x20000000 作为数组首地址,p[3] 访问到的就是 0x2000003 的内容。
下面的例子可以进一步说明:
file1.c:
int *p;
void foo()
{
    printf("int *p/n");
    printf("foo-- p[%x]/n",p);
    printf("foo--&p[%x]/n",&p);
    printf("foo--*p[%x]/n/n",*p);
}
file2.c:
extern int p[];
extern void foo();
int a=0xaaaa;
int main();
{
    p[0]=&a;
    foo();
    printf("extern int p[]/n");
    printf("main- p[%x]/n",p);
    printf("main-&p[%x]/n",&p);
    printf("main-*p[%x]/n",*p);
    return 0;
}
运行结果:
int *p
foo-- p[500a00]
foo--&p[500a10]
foo--*p[aaaa]
extern int p[]
main- p[500a10]
main-&p[500a10]
main-*p[500a00]
 

原创粉丝点击