老生常谈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指针》,按照自己的理解画了图示如下:

老生常谈extern数组与extern指针_第1张图片

之前没有注意到的事项:

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

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

你可能感兴趣的:(老生常谈extern数组与extern指针)