浅谈C语言 extern 指针与数组
/*
* d.c
*
* Created on: Nov 15, 2011
* Author: root
*/
#include "apue.h"
int a[] = {3,2};
void hello()
{
printf("d.c %d",a);
}
/*
============================================================================
Name : hello.c
Author :
Version :
Copyright : Your copyright notice
Description : Hello World in C, Ansi-style
============================================================================
*/
#include "apue.h"
extern void hello();
extern int *a;
int main(void)
{
hello();
printf("\n : %d",a);
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(理解吗?)。
如果将hello.c改成下面这样
#include "apue.h"
extern void hello();
extern int *a;
int main(void)
{
hello();
printf("\n : %d",a[1]); // 这里被修改了
return EXIT_SUCCESS;
}
在main函数中,按照编译器的规矩,a[1]可以被我们这样认为 *(a+1);
因为a等于3,a+1等于4,*(a+1)的意思就是取内存地址为4的字节内容,我不知道地址为4的那个字节里面是什么东西。但是起码不是我们想要的。
转载请注明出处:http://www.cnblogs.com/stonehat/archive/2011/11/15/2250091.html
二、再看下面的代码。
// file : d.c
#include "apue.h"
int *a;
void hello()
{
a =(int *) malloc(2);
a[0]=3;
a[1]=2;
printf("d.c %d",a);
}
// file : hello.c
#include "apue.h"
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,就会发现他们的地址是一样的)。
这种情况下的内存分配是这样的。

如果main函数改成这样的,就是输出a[1]的值,
int main(void)
{
hello();
printf("\n : %d",a[1]);
return EXIT_SUCCESS;
}
按照规矩,输出*(a+1),a等于161968136, 加1,就等于161968140(懂?),就会输出2.
三、再看一种情况。
// d.c
#include "apue.h"
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);
}
// hello.c
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.
转载请注明出处:http://www.cnblogs.com/stonehat/archive/2011/11/15/2250091.html
浅谈C语言 extern 指针与数组的更多相关文章
- 浅谈C中的指针和数组(一)
本文转载地址:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242138.html 在原文的基础上加入自己的想法作为修改. 指针是C/C ...
- 浅谈C中的指针和数组(五)
前面写了一些C指针和数组的一些知识,但是还有一些很重要的知识没有交代,这里做一个补充. 首先看一下,普通变量(指针也是变量)和数组名查看地址的方式是不同的. 查看数组变量的地址,不需要使用 & ...
- 浅谈C中的指针和数组(二)
原文转载地址:http://see.xidian.edu.cn/cpp/html/475.html 在原文的基础上增加自己的想法作为修改 很多初学者弄不清指针和数组到底有什么样的关系.我现在就告诉你: ...
- 浅谈C中的指针和数组(三)
上一个博客我们得到了一个结论: 指针和数组根本就是两个完全不一样的东西.只是它们都可以“以指针形式”或“以下标形式”进行访问.一个是完全的匿名访问,一个是典型的具名+匿名访问.一定要注意的是这个“以X ...
- 浅谈c语言的指针
对于非计算机专业的同学,c语言的指针往往就是老师的一句“指针不考“就带过了.c语言的指针号称是c语言的灵魂,是c语言中最精妙的部分. 指针本质上也是变量,也就是一段内存,只是他的特殊之处是他存储的数据 ...
- 浅谈C中的指针和数组(四)
原文转载地址:http://see.xidian.edu.cn/cpp/html/476.html 在原文的基础上增加自己的思想作为自己的修改 指针数组和数组指针的内存布局 初学者总是分不出指针数组与 ...
- 浅谈C中的指针和数组(六)
数组和指针,原本不想在写了,觉得这部分差不多了,但是自己在写程序的时候还是发现了一个错误.首先说一下我的要求: 给一个函数传递一个二维数组,然后我想在这个函数里面计算这个数组的行数. 写个类似的错误D ...
- 浅谈C中的指针和数组(七)
现在到揭露数组名本质的时候了,先给出三个结论: (1)数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组: (2)数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量: ( ...
- 浅谈C语言中的强符号、弱符号、强引用和弱引用
摘自http://www.jb51.net/article/56924.htm 浅谈C语言中的强符号.弱符号.强引用和弱引用 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2014- ...
随机推荐
- [3.19FJ四校联考]
来自FallDream的博客.未经允许,请勿转载,谢谢. ---------------------------------------------------- A.积分,不会 以后补 B.给定一 ...
- 如何理解Spring AOP
什么是AOP? AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP允 ...
- BigData-‘基于代价优化’究竟是怎么一回事?
本文由 网易云发布. 本文具体讨论了Join基础算法的一种优化方案 – Runtime Filter,在本文最后还引申地聊了聊谓词 下推技术.同时,在本文文章开头,笔者引出了两个问题,SQL执行引 ...
- Spring中@Autowired与@Resource的区别
1.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上. 2.@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必 ...
- js去除空格,判断是否包含
js去除空格 function trimStr(str){ return str.replace(/(^\s*)|(\s*$)/g,""); } js判断是否包含 //是否包含 f ...
- JVM常见问题(二)
6. GC收集器有哪些?它们的特点是? 常见的GC收集器如下图所示,连线代表可搭配使用: 1.Serial收集器(串行收集器) 用于新生代的单线程收集器,收集时需要暂停所有工作线程(Stop the ...
- JavaScript正则表达式模式匹配(2)——分组模式匹配
var pattern=/google{4,8}$/; // {4,8}$表示匹配结尾4-8次 var str='googleeeeeeeee'; // 表示e的4-8次 alert(pattern. ...
- jQuery 效果 – 淡入淡出
在在jQuery中可以通过四个方法来实现元素的淡入淡出,这四个方法分别是:fadeIn().fadeOut().fadeToggle() 以及 fadeTo(),本文通过实例来为你讲解如何在jQuer ...
- 实验与作业(Python)-03 Python程序实例解析
截止日期: 要求: 下周实验课前上交,做好后在实验课上检查可获取平时分. 做出进阶或选做的的请用清晰的标致标识出来,方便老师批改 本次作业:可提交也可不提交.作业算平时成绩. 本次作业内容量较大,请组 ...
- Bootstrap3 排版-缩略语
当鼠标悬停在缩写和缩写词上时就会显示完整内容,Bootstrap 实现了对 HTML 的 <abbr> 元素的增强样式.缩略语元素带有 title 属性,外观表现为带有较浅的虚线框,鼠标移 ...