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

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

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

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有自己的房子(地址)

我这里说指向,而不是说保存,我觉得指向更能说明问题,也可以说保存,内存地址保存的东西是一个char值。看个人理解的不同吧。

例子代码

#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指针变量的地址。

说了这么多 可以确定一个事情是指针就是指针,数组就是数组。有时候把数组当指针用,或者把指针当数组用,都是穿着狼皮的人。一定要注意,小心被咬死。

数组是一块内存区域的集合。说指针的时候,我们一般指指针变量,只有指针变量才体现指针的灵活性。当指针不能变的时候,一般都是做函数参数,避免被修改。

  回复「 篮球的大肚子」进入技术群聊

回复「1024」获取1000G学习资料

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467855.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

f2fs存储结构初探

前言学习文件系统的第一步,先搞清楚文件系统在设备上的存储结构,先来简单了解一下。F2FS空间布局图和描述选自《F2FS技术拆解》https://mp.weixin.qq.com/s/k1ibtWF_TRQi8wbqUGjMrgF2FS空间布局F2FS空间布局整个存储空间被划分为6个区域:超级…

net.conn read 判断数据读取完毕_高并发:缓存模式以及缓存的数据一致性

缓存由于其高性能,支持高并发的特性,在高并发的项目中不可或缺。被大家广泛使用的有Redis,Memcached等。本文主要探讨几种常见的缓存的读写模式,以及如何来保证缓存和数据库的数据一致性。这里大家可以关注一下我的个人专栏《PHP进…

PHP配置环境中开启GD库

下配置好的PHP环境中,GD库不像windows那样可以直接用,而是默认关闭,需要把它打开,去到php.ini文件中 找到php_gd2.dll把分号去掉即可。(注:GD库跟绘制二维码等有关) 转载于:https://www.cnblogs.com/mrszhou/p/7421161…

USB协议普及文

#目录#USB#USB On-The-Go Supplement#技术指标#机械和电气标准#编码方式#软件架构#端点#HCD#USB 封包格式#设备分类#USB接头#电源#Storage#人机接口设备(HID)通用串行总线(Universal Serial Bus, USB)是连接外部设备的一个串口总线标准&#…

mysql jdbc驱动_JDBC认识与实践

一、什么是JDBC?Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC思维导图二、JDBC应…

画布实现拼图原理

1. 页面布局 1.1 bg: 背景提示图,使用半透明效果,移动图片后显示,层级最低,z-index:-1; 1.2 cvs: 当前画布,层级默认0; 1.3 content: 覆盖在画布之上 z-index:1; 1.3.1 currentCheckpoint: 显示当前关卡数…

晚归的码农老公

呃,我是本号主的贤内助,我们的儿子叫楠哥~由于疫情的影响,我们已经很久没有带楠楠回他外婆家玩了,只能用电话跟外婆聊聊家常。每一次通话结束,他外婆总会加问一句,启发回来了吧。我们每次的回答都是&#x…

Rockchip USB转485

#RS232 / RS485 简介#RS232#RS485#R485与RS232比较#开发#DTS配置#驱动开发#POSIX规范API#HAL层以上APP层#APK call JNI#APP#调试#log开启#RS232/RS485/RS422常见问题#RS232 / RS485 简介#RS232RS-232是美国电子工业联盟(EIA)制定的串行数据通信的接口标…

高嘌呤食物搜索引擎_“高嘌呤”的食物已发现,尿酸高的人,要尽量挑着吃!...

导语:在我们的生活中又出现了一种现象,越来越频发,也是越来越倾向于年轻化,那么就是高尿酸,现在高尿酸已经被列为了我们国家的第四高,身体内的嘌呤含量是一部分,那么另一部分也是来源于我们平时…

罗老师带货了

相对比其他事情,我对罗老师带货很感兴趣,也许这样说,我对罗老师这个人比较感兴趣。罗老师是一个经过大风大浪的男人,经过了各种风雨,终于找到自己的位置,也决定在这个位置上发光发热了。我觉得他会像冯提莫…

【Linux笔记】LED驱动程序

前言 上一篇我们分享了字符设备驱动框架:【Linux笔记】驱动基础篇,当时分享的是hello驱动程序。学STM32我们从点灯开始,学Linux驱动我们自然也要点个灯来玩玩,尽量在从这些基础例程中榨取知识,细抠、细抠,为…

oracle trigger 延迟执行_一文详解Spring任务执行和调度

一、概述Spring框架分别使用TaskExecutor和TaskScheduler接口提供异步执行和任务调度的抽象。Spring还提供了这些接口的实现,这些接口支持线程池或将其委托给应用服务器环境中的CommonJ。二、TaskExecutorSpring 2.0 开始引入的新的抽像。Executors 是线程池的Java …

数据库(2)

文章目录数据表操作完整性约束AUTO_INCREMWNTNOT NULL非空唯一性约束UNIQUE KEY(KEY可省略)修改表结构的方式修改表名添加字段删除字段修改字段添加默认值删除默认值添加主键删除主键添加唯一删除唯一修改表的存储引擎设置自增长的值删除数据表DML插入数…

中resource文件夹的作用_冲突与碰撞:OpenStack中的虚拟机和裸机

冲突与碰撞:OpenStack中的虚拟机和裸机要虚拟化还是非虚拟化?如果您追求性能,那么就没有争议——裸机仍然胜过虚拟机;特别是对于I/O密集型应用程序。但是,除非您可以保证充分利用它,否则是有代价的。在本文…

看看大神是如何计算32位数中‘1’的个数

偶然看到一份代码,代码是计算一个int数中 ‘1’ 的个数的,当然,可能这不是什么值得讨论的事情,但如果你看看大神如何写这段代码的,就觉得这个是一个需要了解的知识。int count_bits(int x) {register int xxx;xxxx-((…

MySQL运算符,函数,索引,图形化管理工具

文章目录运算符算术运算符比较运算符逻辑运算符MySQL运算符数字函数字符串函数日期时间函数条件函数系统信息函数加密函数其他常用函数MySQL索引索引的概念索引的分类创建索引创建表时创建索引在已经存在的表上创建索引删除索引MySQL图形化管理工具PHPMyAdminSQLyog运算符 算术…

Linux下的gpio,gpiod

GPIO 应该是每个嵌入式设备都避免不了的。最近在做项目的时候,也遇到这方面的问题,所以简单总结一下现在内核里面多了gpiod的来控制gpio口,相对于原来的形式,使用gpiod的好处是我们申请后不进行free也没有什么问题。但是你要是使用…

剖析大神代码,计算整型里面1的个数

昨天的文章,可能很多人看了不知道怎么回事,确实,我也是看了之后一头雾水。先给出个简单的例子#include "stdio.h"int count_bits4(char x) {x (x&0x55) ((x>>1)&0x55);x (x&0x33) ((x>>2)&0x33);x…

机器学习导论 与数学分析

文章目录机器学习定义说人话例子专家系统 定义好, 应招,速度快机器学习 实验 奖惩 调参对象任务 TASK T一个或多个经验 EXPERIENCE性能PERFORMANCE类比人类学习监督学习半监督学习无监督学习增强学习可解决问题不可解决问题举例f(x&#xff0…

聊聊、Highcharts 动态数据

最近项目中需要用到图表,找了几个开源框架,最后选择 Highcharts,原因是 Highcharts 功能强大,稳定,方便,而且开源,社区比较成熟。 首先下载 Highcharts,导入项目。 在 HTML 页面引入…