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

导语

在这里我们做种强调的是在两个文件中,定义为数组声明为指针和定义为指声明为数组的这辆中情况。那么我们就需要两个源文件test.c和main.c。

定义为数组,声明为指针

test.c

char arr[] = "abcdef";

main.c

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>extern char *arr;   //声明int main()
{printf("%s\n", arr);system("pause");return 0;
}

就会出现以下的错误:

就会出现,读取位置发生访问冲突

  • 首先我们需要知道的是定义和声明使用的是同一块空间,我们在test.c中定义为数组,在main.c中使用,不管声明为数组还是指针都是用的是这一块空间。这里将声明的arr当为指针取出来的是四个字节的值,然后在打印字符串时,就会将这四个字节的值作为一个地址去寻找,我们可以先来看看代码呈现。

我们会发现“64636261”不是dcba的ASSCII码吗?

所以我们就知道了它为何地址访问出错。看下图:这里指针去访问了四个字节的空间,然后取出了dcba,将dcba当做地址码去取出字符,造成地址访问出错。那我们如何在定义为数组、声明为指针的情况下,取出数组中所存的字符串?

  • 要取出字符串,就必须知道首元素’a’的地址,上述的描述,不就让我们知道了arr中存放的就是64636261相当于dcba,我们对arr取地址就相当于取到了abcd的地址,我们在对这个地址强制转换为char*类型,不就取到了一个字节’a’的地址。字符串知道了首元素地址,打印就很方便啦!

main.c

#include <stdio.h>extern char *arr;int main()
{//printf("%s\n", arr);printf("%s\n", (char*)&arr);system("pause");return 0;
}

定义为指针,声明为数组

test.c

char *p = "abcdef";

main.c

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdlib.h>
#include <stdio.h>extern char arr[];  //这里只是说他是一个数组,不需要填写数组个数int main()
{printf("%s\n", p);system("pause");return 0;
}

运行之后就会发现,呀!我的程序运行出来是随机值,不对呀,我明明将它存放进去了。

  • 首先我们就得清楚这个数组里面存放的是什么?

  • 定义为指针,然后指向了字符串”abcdef”,这里指针里面就存的是字符串首元素的地址

  • 声明为数组,定义为指针,大小只有四个字节,所以数组的大小也只有四个字节

  • 指针中存放的是字符串首元素的地址,数组中存放的是字符串首元素的地址,所以打印出来就是乱码了。

图解如下图所示:那我们如何在定义为指针、声明为数组的情况下,取出指针中所指向的字符串?

  • 我们要找到字符串,就要将指针所存放的四个字节一次取出来,因为字符数组一次只能读一个字节,* 所以,我们需要把它强转为int*

  • 取出后,我们需要知道它里面的内容,就必须把它解引用,取出四个字节的地址,(int )p

  • 最后,我们要找到’a’的地址,就必须强转为char*,才能取出’a’的地址。main.c

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdlib.h>
#include <stdio.h>extern char p[];    //这里只是说他是一个数组,不需要填写数组个数int main()
{printf("%s\n", (char*)*(int*)p);system("pause");return 0;
}

总结:

  1. 定义和声明使用的是同一块空间

  2. 指针大小是4个字节,数组大小不一定

  3. 指针和数组不一样

转自:

https://blog.csdn.net/meng_lemon/article/details/80642938

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

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

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

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

相关文章

python selenium环境配置Firefox和Chrome

1、下载Selenium库&#xff0c;可以使用pip install selenium https://pypi.python.org/pypi/selenium/ 2、下载驱动 Chrome: https://sites.google.com/a/chromium.org/chromedriver/downloads Firefox: https://github.com/mozilla/geckodriver/releases 3、配置环境变量 需要…

BUG_ON()、panic()、dump_stack()几种内核调试手段

Linux内核有一些方法可以用来方便标记bug&#xff0c;提供断言并输出信息。最常用的两个是BUG()和BUG_ON()。当被调用的时候&#xff0c;它们会引发oops&#xff0c;导致栈的回溯和错误信息的打印。这些声明会导致 oops跟硬件的体系结构是相关的。大部分体系结构把BUG()和BUG_O…

wordvba编程代码大全_这几本基础编程书籍一定要看

程序员书库(ID&#xff1a;OpenSourceTop) 编译书单来自&#xff1a;https://simpleprogrammer.com/best-programming-books-2019/关于程序员类的技术书籍有很多&#xff0c;但是往往没有时间阅读&#xff0c;下面的这些书籍&#xff0c;由John Sonmez精选&#xff0c;可以帮助…

经典DP

1.背包问题 &#xff08;1&#xff09;01背包 从n个重量和价值分别为wi,vi的物品&#xff0c;从中选出不超过W的物品&#xff0c;每种物品仅有一件&#xff0c;求所有方案中V的最大值。 最朴素最简单也最费时的方法&#xff1a;O(2^n) int rec(int i,int j)//从第i个开始挑选总…

C语言、嵌入式重点知识:回调函数

前言 上文分享了一个专用的双链表的基本操作示例&#xff1a;双链表的操作示例&#xff08;附代码&#xff09;这里提到了一个关键词&#xff1a;专用。与专用对应的词是通用。我们从字面上可以很容易理解这两个词&#xff0c;专用就是针对特定情况的&#xff0c;特点就是很有局…

今天我勇敢的点就一个gpio口

现在已经三月份了&#xff0c;时间过得超快&#xff0c;早上起来打开电脑&#xff0c;有点不习惯&#xff0c;微信群唧唧歪歪的那些股神今天不知为什么安静了。我喜欢看大家热闹的样子&#xff0c;更喜欢热闹的时候给我们发几个红包。我记得2015年&#xff0c;股市非常好&#…

数据结构(4)

文章目录栈与队列栈队列![在这里插入图片描述](https://img-blog.csdnimg.cn/20200301182116946.png?x-oss-processimage/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzY2Mzc4MA,size_16,color_FFFFFF,t_70)栈与队列 栈 ha…

写一个公用的gpio口驱动

因为项目需要控制的GPIO口比较多&#xff0c;如果每个GPIO口都写一个驱动就显得比骄麻烦&#xff0c;所以就写了一个通用的GPIO口驱动。只要dts里面配置好设备GPIO相关信息就可以自动加载了。可以很充分的体现多个设备一个驱动的优良性。dts文件gpio_rs485: gpio_rs485 {status…

数据结构(5)

文章目录各种算法选择排序插入排序希尔排序***快速排序***归并排序二分查找各种算法 def bubble_sort(alist):"""冒泡排序"""n len(alist)for j in range(n-1):count 0for i in range(0, n-1-j):# 班长从头走到尾if alist[i] > alist[i1]:a…

大神们都应该去哪里工作?

接上一篇文章。文中提到我认识了一个做嵌入式的大神&#xff0c;技术真的非常厉害。我们在调试过程中&#xff0c;遇到问题&#xff0c;他总是能告诉我们排查的手段&#xff0c;而且针对一个问题&#xff0c;他能想到几种不同的解决方案。嵌入式驱动跟其他软件有点不一样&#…

大华管理平台用户名_智能财务引领商业与管理变革——浙大EMBA首席财务官研习社走进大华股份...

杭商传媒记者 周 珂/文 徐青青/摄编辑 何影丹当前经济环境和市场需求瞬息万变&#xff0c;企业竞争日益激烈&#xff0c;盈利持续下降&#xff0c;产品、服务同质化严重&#xff0c;这不仅对业务部门提出了挑战&#xff0c;也对传统的财务管理产生了巨大的冲击。财务不能高…

【深度】韦东山:一文看尽 linux对中断处理的前世今生

作者&#xff1a;韦东山前言&#xff1a;本文&#xff0c;4200字&#xff0c;研究代码花了一天&#xff0c;写出来花了一天&#xff1b;录视频估计又得花半天&#xff1b;真怀念以前简单粗暴的生活啊&#xff1a;拿起话筒就录视频&#xff0c;先画好图&#xff1f;那是不需要的…

数据结构(6)二叉树

文章目录二叉树二叉树三种遍历二叉树知中及先或后序&#xff0c;求二叉树二叉树 class Node(object):""""""def __init__(self, item):self.elem itemself.lchild Noneself.rchild Noneclass Tree(object):"""二叉树"&qu…

鼠标中间无法打开新标签_还记得鼠标有几个键?Win10环境鼠标中键的妙用

大家经常使用鼠标&#xff0c;但有多少人还能意识到&#xff0c;其实鼠标是有三个键的&#xff1f;除了常用的左键右键&#xff0c;鼠标中间的滚轮也可以按下去&#xff0c;然而鼠标的这个中键&#xff0c;却日常坐冷板凳&#xff0c;几乎被人所遗忘。其实&#xff0c;鼠标中键…

找不到问题的核心,你永远解决不了问题。

上学那会儿&#xff0c;我是个数学常拿60分的人&#xff08;满分150分&#xff09;&#xff0c;我却喜欢做几何题。根据已知的条件&#xff0c;推导出所需的其他条件&#xff0c;所有需要的条件得出后&#xff0c;再根据正确的公式算出所求的值。这个不断求解的过程其实挺有意思…

浏览器访问pdf 的url怎么加密_怎么解决加密的pdf文件?

加密版的PDF文件我们每次打开时都需要输入密码才能进行阅读&#xff0c;而且一般不能直接进行复制和打印&#xff0c;这样会非常的麻烦。那如果我门想要解决这一问题呢就要将pdf文件的密码进行解除&#xff0c;可是如果是平民的我们不会解决怎么办呢&#xff1f;毕竟我们又不是…

Linux Storage入门学习

前言本文大量代码基于linux 0.11&#xff0c;因为早期linux的版本更加适合初学者入门。虽然代码比较早&#xff0c;但是不妨碍我们学习Linux Storage的精髓。一、hello world1.1 Demo#include<stdio.h> #include<unistd.h> #include<sys/types.h> #include&l…

地铁客流检测训练问题记录

一 报错&#xff1a; File "/home/jz/py-faster-rcnn/tools/../lib/datasets/pascal_voc.py", line 183, in _load_pascal_annotation tree ET.parse(filename) File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 1182, in parse tree.parse(sou…

记一次和摄像头的摩擦经历

因为时间的原因&#xff0c;这次点亮摄像头的时间特别短&#xff0c;昨天下午模组到公司&#xff0c;今天下午点亮。几个人一起调试&#xff0c;发现的问题也很多&#xff0c;今天下午发现有一个怀疑的问题&#xff0c;我马上驱车几十公里去模组厂调试&#xff0c;回来的时候&a…

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

之前写发的那篇指针和数组的文章&#xff0c;有网友评论觉得不是很舒服&#xff0c;我自己看了&#xff0c;觉得很不满意。所以想再写写&#xff0c;尽量把这个东西讲清楚。#定义为数组&#xff0c;声明为指针1.c中#include "stdio.h" char array[] "abcd"…