绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
声明为指针,定义为数组,声明为数组,定义为指针
2020-03-18 18:10:27

之前写发的那篇指针和数组的文章,有网友评论觉得不是很舒服,我自己看了,觉得很不满意。所以想再写写,尽量把这个东西讲清楚。

#定义为数组,声明为指针

1.c中

#include "stdio.h"
char array[] = "abcd";

2.c中

#include "stdio.h"
extern char *array;
int main(void){
	printf("%p\n",array);
	printf("%s\n",(char*)array);
	return (0);
}

我们编译一下


我们运行一下


好了,到了关键的时候了 我们分析一下

声明和定义的区别 声明是只给房产证,但是不给你分房子,实际上没地方住。定义呢,是给你分了房子,也给你发了房产证。

不同的文件编译 编译器是按照一个文件一个文件进行编译的,所以在1.c里面编译器知道这个是一个 char 的字符串。但是在2.c里面,编译器知道这个是一个指针。

数组和指针有什么不同? 数组是一个集合,把同类型的数据放在一个集合里面,数组名代表的是这个集合。就像一个军队的班长,排长等等。

有点意思的是,数组的地址和数组首元素的地址值一样,所以才引发了各种有意思的血案。

指针其实就是一个地址,指针变量就是一个可以存相同类型不同值的地址。

a存的是一个4byte的地址,这个地址里面存的东西是一个char字符。但是a本身是有房子住的,&a有自己的房子(地址)。

例子代码

#include "stdio.h"

int main()
{
	char b = 'b';
	char *a = &b;
	
	printf("&a:%p\n",&a);
	printf("a:%p\n",a);
	printf("*&a:%p\n",*&a);
	printf("*a:%c\n",*a);
	
	return 0;
} 

输出


array 定义在1.c中是一个数组,他在1.c里面,政府给他分了房子也发了房产证。 但是在2.c里面,另一个乡政府因为某种原因,只给array发了房产证,而且这个房产证上写的房子地址是1.c里面那个array的地址。 但是写房产证形式的时候,说这个房子的形式是char * array 「声明为指针」这样的形式的。

这样的形式导致什么问题呢? 这样的形式导致 array = "abcd"。就是说abcd的值赋值给了array。 然后我们使用* 去开锁的时候。我们就是 * “abcd” = * 64636261。 但是 64636261 地址并不合法的,如果访问了不合法的地址。那就会出现问题了。就比如政府说这块地才能种菜,你跑到其他地方去种菜了,就可能被抓起来。

贴上一个ASCII表


我这样解释,还有啥问题的,请留言一起讨论下。

#定义为指针,声明为数组

1.c中

#include "stdio.h"
char *array = "abcdefg";

void p_test(void)
{
	printf("%p %p\n",array,&array);
	printf("%s\n",array);
}

2.c中

#include "stdio.h"
extern void p_test(void);
extern char array[];
int main(void){
	printf("%p\n",array);
	printf("%s %.2x%.2x%.2x%.2x\n",array,array[0],array[1],array[2],array[3]);
	p_test();
	return (0);
}

运行一下


在文件1.c中 array 是一个指针,编译器给这个指针4byte的存储空间。指针的值是 “abcdefg”这个字符串的首地址。这个字符串的存储空间分配在常量区,里面的内容是不能修改的。

在文件2.c中 array 是一个数组,数组的大小是不知道的,但是这个数组的地址是哪里,是我们关心的重点。 从上面打印可以看出来,数组的首地址是等于 1.c文件里面array指针变量的地址。

说了这么多 可以确定一个指针就是指针,数组就是数组。


分享好友

分享这个小栈给你的朋友们,一起进步吧。

Linux技术精选专区
创建时间:2020-07-08 10:30:23
Linux,全称GNU/Linux,是一套免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年次释出,它主要受到Minix和Unix思想的启发,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • dapan
    专家
戳我,来吐槽~