所谓定义,就是让它不存在的时候要让他存在。
所谓声明,就是让它不知道的时候被知道。
看代码:
test.c文件
extern char arr[];
extern char *p;
int main()
{
printf("%s\n", arr);
printf("%s\n", p);
system("pause");
return 0;
}
main.c文件:
char arr[] = "abcdefg";
char *p = "abcdefg";
结果:
在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’的地址 。