在mian.c中extern表示arr和p是外部文件定义的变量,在使用的时候就去其他的模块中寻找。也可以理解成,声明一个外部的变量。通过对结果的分析,我们知道:声明的就是一个变量本身,声明和定义作用于同一块空间。
换一种方式写代码:
(1)定义数组,声明指针
main.c文件 char arr[] = "abcdefg"; test.c文件 extern char *arr; int main() { printf("%s\n", arr); system("pause"); return 0; } 这个结果会挂掉, 为什么? 当main.c中定义char arr[]为数组,保存在空间中为‘61’‘62’‘63’‘64’‘65’‘66’‘67’ 在test.c中声明char *arr为指针,四个字节,打印的时候,拿到的是“61626364”这样的地址,这样的地址指的哪谁也不知道,所以就有访问出错。 如何修改呢? main.c文件 char arr[] = "abcdefg"; test.c文件 extern char *arr; int main() { printf("%s\n", (char *)&arr); system("pause"); return 0; } 将arr的地址拿出来(“61626364”),然后强制类型转换成 char *,就可以得到字符‘a’的地址了。 (2)定义指针,声明数组 main.c文件 char *p = "abcdefg"; test.c文件 extern char p[]; int main() { printf("%s\n", p); system("pause"); return 0; } 这个有输出什么? 运行多边,发现是随机值。为什么随机值?
先将“abcdefg”中‘a’的地址放在*p中,声明是将p声明成数组,打印时p单独存在,就为数组名,表示首元素的地址,这个地址指向*p的首元素,但是*p的首元素(“abcdefg”中‘a’的地址)是什么我们不知道,所以输出的是随机值。
那么这要怎么修改呢? main.c文件 char *p = "abcdefg"; test.c文件 extern char p[]; int main() { printf("%s\n", (char *)*(int *)p); system("pause"); return 0; } 先将p强制类型转化成(int *),就是从p开始往后拿四个字节,然后 * 取到四个字节的内容,由于拿到的是整型,所以在强制类型转化成char *就可以拿到 “abcdefg”中‘a’的地址 。