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

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

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

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,一经查实,立即删除!

相关文章

python部落稿酬_Python之父考虑重构Python解释器

作者:佚名来源:Python部落7月22日,Python之父Guido在Medium上发表了他的第一篇博文《PEG Parser》。在该文中,Guido说他正在考虑使用PEG Parser代替现有的类LL(1) Parser(名为pgen),来重构Python解释器。原因是现在的 …

f2fs存储结构初探

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

Android系统驱动【转】

本文转载自:http://www.hovercool.com/en/%E6%B7%BB%E5%8A%A0%E9%A9%B1%E5%8A%A8%E6%A8%A1%E5%9D%97#a_.E5.9B.9B.E3.80.81.E9.85.8D.E7.BD.AE.E7.B3.BB.E7.BB.9F.E7.9A.84autoconfig 一、编写驱动核心程序 这里说的驱动核心程序是指运行在内核空间的,完…

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…

100篇文章(5)

On Libraries’ Service Library are very important to students’campus life. However,many students’complain that libraries in their universities cannot meet their needThe first problem is nearly of all school libraries is their limited space.There always …

python绘制图像的参数_图像绘制.draw.line():系统错误:新样式getargs格式,但参数不是tup...

我在这个问题上看到了多个问题,但没能找到问题的答案。基本上,我只想在图像上画一条线,从python中的外部文件中获取坐标。我的代码是:import Image, ImageDrawimport sysimport csvim Image.open("screen.png")draw I…

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)制定的串行数据通信的接口标…

100篇范文(7)

How should college students spend their spare time? College is a place where students arrange their own studies and take part in all kinds of activities as they like.Thus,plenty of time is left at college students’disposal.How should student spend their…

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

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

罗老师带货了

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

缓存优化过程中的一些思考

最近一段时间在做双十一的优化,对于缓存的使用和改造渐渐有了一些思考,记录一下 缓存的使用、选择 * 读简单,写复杂的业务最好放在写入端 * 读复杂,写简单的业务逻辑放在读取端 * 根据业务的类型,选择是使用集中式缓存…

【Linux笔记】LED驱动程序

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

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

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

[转]命令行在IIS添加虚拟目录

来自:http://www.jb51.net/softjc/29702.htmlMkwebdir -c LocalHost -w "Default Web Site" –v CommonImages,D:\Images 附:这些管理性脚本是IIS自带的.缺省被安装在了C:\Inetpub\AdminScripts下. 让用户密码永不过期: net accounts /maxpwage:unlimi转…

数据库(2)

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