数组和指针的区别
来源:互联网 发布:纯爱社区更改域名 编辑:程序博客网 时间: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]
- 指针数组和数组指针的区别
- 指针数组和数组指针的区别
- 指针数组和数组指针的区别
- 数组指针和指针数组的区别
- 指针数组和数组指针的区别
- 数组指针和指针数组的区别
- 数组指针和指针数组的区别
- 数组指针和指针数组的区别
- 数组指针和指针数组的区别
- 数组指针和指针数组的区别
- 数组指针和指针数组的区别
- 数组指针和指针数组的区别
- 数组指针和指针数组的区别
- 数组指针和指针数组的区别
- 数组指针和指针数组的区别
- 数组指针和指针数组的区别
- 指针数组和数组指针的区别
- 数组指针和指针数组的区别
- 常用Word中的快捷键
- 自己修理身体小毛病
- [转]C#正则表达式小结
- 孤单紫罗兰...
- 微软学生软件资源--点亮梦想计划
- 数组和指针的区别
- Visual Studio 2005 代码片段
- Java jdbc mysql的封装类
- sdk之菜单使用二
- Your first C# Web Service
- MySQL
- 常识(1)- TriggerEvent()/Event()/PostEvent()有什么不同
- 使用IFrame编辑文本
- ASP.NET从服务器下载文件的原代码