指针和数组的定义与声明

所谓定义,就是让它不存在的时候要让他存在。
所谓声明,就是让它不知道的时候被知道。

看代码:
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’的地址

猜你喜欢

转载自blog.csdn.net/oldwang1999/article/details/80362539