C语言指针与数组的区别(1) extern
来源:互联网 发布:四轴加工中心编程实例 编辑:程序博客网 时间:2024/05/02 03:02
近日阅读c专家编程,对c语言中的指针数组的区别有了新的认识。
先看一段代码:
//des.cint a[] = {3,2};void hello(){ printf("d.c %d",a);}
//test.c#include<stdio.h>extern void hello();extern int *a;int main(void){ hello(); printf("\n : %d",a);//printf("\n : %d",a[1]); return EXIT_SUCCESS;}上面的代码的输出为
d.c 134520856
: 3第一行代码是第一个文件d.c输出了int a[];a的内容
第二行代码是第二个文件hello.c输出了extern int *a;指针a的内容
gcc编译的时候,在链接阶段了,hello.o有extern a符号,在d.o中找到,所以extern a 和d.o的a是同一个符号(我认为称他们“指向相同”有歧义)
也可以用图像表示
。数组第一项在内存地址134520856处。
第一个文件d.c将a当成数组来处理,可以按照想象的进行输出,但是
但是第二个文件是把符号a当成指针来操作的(因为 extern int *a), 指针所在的地址是134520856,但是指针的值是3
如果去掉注释之后,则会报错,因为在main函数中,按照编译器的规矩,a[1]可以被我们这样认为 *(a+1);
因为a等于3,a+1等于4,*(a+1)的意思就是取内存地址为4的字节内容,我不知道地址为4的那个字节里面是什么东西。
再看下面代码:
int *a;void hello(){ a =(int *) malloc(2); a[0]=3; a[1]=2; printf("d.c %d",a); }
extern void hello();extern int *a;int main(void){ hello(); printf("\n : %d",a); return EXIT_SUCCESS; }
输出结果:
d.c 161968136
: 161968136我说了实际上 只要是extern a就表示这两个a符号,实际上是同一个符号a,(你可以将两个文件的函数输出&a,就会发现他们的地址是一样的)。
这种情况下的内存分配是这样的。
最后再看一个代码:
int *a;void hello(){ a =(int *) malloc(2); a[0]=3; a[1]=2; printf("d.c value:%d\n",a); printf("d.c address:%d\n",&a); }
extern void hello();extern int a[];int main(void){ hello(); printf("hello.c value:%d\n",a); printf("hello.c address:%d\n",&a); printf("hello.c a[1]",a[1]); return EXIT_SUCCESS; }
输出结果为:
d.c value:160223240
d.c address:134520864
hello.c value:134520864
hello.c address:134520864
hello.c a[1]内存分布图为:
在hello.c中,a被当成int a[];
a的值为160223240, *(a+1),就能够访问到2.
总结:
编译器在编译的时候左值会由编译器分配地址,而右值运行时才能知道,当我们声明一个指针变量的时候,会首先为指针变量开辟一个内存空间,
即指针地址是确定的,但是指针所指向的地方时在运行时才知道。如果使用指针引用定义数组中的元素时,会将数组元素的值解析成地址,就造成了
访问错误
- C语言指针与数组的区别(1) extern
- 浅谈C语言 extern 指针与数组
- 浅谈C语言 extern 指针与数组
- C语言数组与指针的区别
- 【指针篇】C语言:指针与数组的区别,数组指针与指针数组的剖析。
- C语言中指针与数组的区别与联系
- c语言中数组和指针的区别与联系
- C语言中数组与指针的区别
- C语言中,指针字符串与数组字符串的区别
- C语言字符串指针变量与字符数组的区别
- C语言字符串指针变量与字符数组的区别
- c语言中字符指针与字符数组的区别
- C语言字符串指针与字符数组的区别
- c语言核心整理之指针与数组的区别
- 转-C语言中使用指针与数组的区别
- 数组与指针区别c语言
- C语言指针、数组指针和指针数组的区别
- C语言:数组和指针的区别
- C++第14周报告(一)用递归函数求解表达式
- jsp刷新页面大全
- jsp常用的5种跳转方法
- 【Linux 驱动】第二章 构造和运行模块
- C++第14周报告(二)用循环控制语句编写程序,完成表达式的计算
- C语言指针与数组的区别(1) extern
- FFMpeg框架代码阅读
- 2012-4-11-学习笔记
- 分享一些个人觉得非常好用的软件吧
- Oracle中的索引详解
- 今天总结
- 编写一个程序,输入一行字符,以回车结束,分别统计出其中的英文字母、空格、数字和其他字符的数
- 原来编译原理可以这么学
- POJ 1033-Defragment 简单搜索