老生常谈extern数组与extern指针

见了皓哥http://coolshell.cn/articles/945.html/comment-page-3#comment-510465中的第五题:

//file1.c
int arr[80];

//file2.c
extern int *arr;
int main()  
{      
    arr[1] = 100;
    printf("%d\n", arr[1]);
    return 0;  
}
又查看了《C专家编程》第四章指针、数组部分,还是没有完全理解,再参考 http://blog.csdn.net/hxg130435477/article/details/4012686《extern数组与extern指针》,按照自己的理解画了图示如下:

之前没有注意到的事项:

1. 对数组定义int arr[80] = {4,5,6,7};

arr本身并不分配内存,通过打印输出发现,arr与&arr值是相同的;我理解编译器把arr和某个地址比如0x8625008同等对待;就像编译器不会为0x8625008地址本身分配内存,仅仅作为一个标号而已;

2. 要分清“声明”与“定义”:定义只能有一个,负责确定对象的类型并分配内存,用于创建新对象(函数或变量),而声明描述对象的类型,用于指代其他地方定义的对象;

3. 链接器符合替换的原理不是很了解,根据推测,链接器是将file2.c中的“标号arr”简单替换成file1.c中的arr,此处说的“标号arr”替换应该是《C专家编程》P83讲的“左值”替换,及&arr替换;所以file2.c中&arr指向的内存替换为在file1.c中分配的部分;

4.区分地址的“左值”和“右值”;


知识点扩充:

1.http://blog.csdn.net/chgaowei/article/details/7173436

 

新手小心:c语言的强符号和弱符号

2..http://www.crazyshell.org/blog/?p=619

深析静态链接库和动态链接库相同函数覆盖及库调用顺序问题

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值