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

导语

在这里我们做种强调的是在两个文件中,定义为数组声明为指针和定义为指声明为数组的这辆中情况。那么我们就需要两个源文件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,一经查实,立即删除!

相关文章

100条常用写作谚语(5)(6)(7)(8)

文章目录金钱与财富珍惜时光择友与友谊常理与法则金钱与财富 Gold will not buy anything黄金不能买一切 The chief aim of man is not to get money 人的主要目的不是赚钱 The money the miser hoards will do him not good 守财奴积财&#xff0c;对自己毫无好处 What is we…

python中内置的集成开发工具_python应用(3):启用集成开发工具pycharm

之前写了个python程序给自己用&#xff0c;写代码时用的是macvim(vim的一种)&#xff0c;macvim是个编辑工具&#xff0c;由于我已经设置过对python等各种语言的支持特性&#xff0c;所以什么缩进、对齐、高亮之类的表现都有&#xff0c;写起代码来非常舒服。可是&#xff0c;不…

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;特点就是很有局…

python神经网络预测结果每次不一样_神经网络预测

神经网络预测时间:2019-12-09 12:34:00 作者&#xff1a;路由君 来源&#xff1a;路由器之家路由器之家网今天精心准备的是《神经网络预测》&#xff0c;下面是详解&#xff01;bp神经网络预测是不是数据越多&#xff0c;预测能力就越好&#xff1f;不仅是神经网络&#xff0c;…

js数组的拷贝赋值复制二三事总结

今天在看React-native性能优化的时候&#xff0c;看到如何避免shouldComponentUpdate的异常数据时&#xff0c;脑内一阵风暴&#xff0c;从而牵连出一连串的问题&#xff0c;于是有了这一篇关于js数组的复制&#xff08;深浅拷贝&#xff09;与赋值等为何能产生异常数据的文章。…

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

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

Linux 通用gpio口驱动,rockchip

dts文件 gpio_rs485: gpio_rs485 {status = "okay";compatible = "gpio,px30-gpio";cname = "rs485";en-gpio = <&gpio3 12 GPIO_ACTIVE_HIGH>;}

android自定义控件

---恢复内容开始--- 1.新建一个类&#xff0c;继承View父类。重写一个或多个构造器后&#xff0c;在图编辑器里就有该控件可以拖动添加了。 2.若想使用Draw来绘制自己的控件。可以在View&#xff08;&#xff09;方法中使用Draw&#xff08;&#xff09;来绘制。 3.还可以定义控…

python语言中strike_Python学习笔记

嵌套函数作用域def make_adder(augend):def add(addend):return augend addendreturn add内部的函数可以访问外部函数scope内的变量&#xff0c;但是不能够重新对其赋值。如果重新赋值那么会在内部函数的scope内创建一个同名的本地变量(Python不允许对non-local变量赋值)。yie…

数据结构(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;他能想到几种不同的解决方案。嵌入式驱动跟其他软件有点不一样&#…

堆喷射

堆喷射主要用于绕过ASLR。下面演示堆喷射分析与效果。 1.代码 void heap_spray(){   char chunk[LEN] { 0 };   memset(chunk, 0x90, LEN - 10);   strcat(chunk, "shellcode");   for (int i 0;i < 100;i)   {     void *p malloc(LEN);    …

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

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

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

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