指针和数组的定义与声明

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

看代码:
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’的地址
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值