char *a 与char a[] 的区别和char** argv与char *argv[]区别

char *a 与char a[] 的区别

char *a = "hello" 中的a是指向第一个字符‘a'的一个指针

char a[20] = "hello" 中数组名a也是执行数组第一个字符‘h’的指针

但二者并不相同

看实例:把两个字符串相加:


结果:

hello0123456789

对比:


Segmentation fault

把字符串加到指针所指的字串上去,出现段错误,本质原因:*d="0123456789"存放在常量区,是无法修的。而数组是存放在中,是可以修改的。两者区别如下:

一. ”读“ ”写“ 能力

  • char *a = "abcd";  此时"abcd"存放在常量区。通过指针只可以访问字符串常量,而不可以改变它。
  • 而char a[20] = "abcd"; 此时 "abcd"存放在栈。可以通过指针去访问和修改数组内容。

二. 赋值时刻

  • char *a = "abcd"; 是在编译时就确定了(因为为常量)。
  • 而char a[20] = "abcd"; 在运行时确定

三. 存取效率

  • char *a = "abcd"; 存于静态存储区。在栈上的数组比指针所指向字符串快。因此慢
  • 而char a[20] = "abcd"; 存于栈上。快

另外注意:

char a[] = "01234",虽然没有指明字符串的长度,但是此时系统已经开好了,就是大小为6-----'0' '1' '2' '3' '4' '5' '\0',(注意strlen(a)是不计‘\0’)

看一结构中出现的同样的问题:

这样红色部分在调用Init函数时会出现“Segment Default", 因为此时 指针n是静态的,只有“读”的本事,不可以改变。

 

内存分配方式
内存分配有三种:静态存储区、堆区和栈区。他们的功能不同,对他们使用方式也就不同。

  1. 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。
  2. 栈区:在执行函数时,函数(包括main函数)内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。(任何变量都处于站区,例如int a[] = {1, 2},变量a处于栈区。数组的内容也存在于栈区。)
  3. 堆区:亦称动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存。 但是,良好的编程习惯是:如果某动态内存不再使用,需要将其释放掉,并立即将指针置位NULL,防止产生野指针。

char** argv与char *argv[]区别


指针是个地址。
char *a: a的值包含字符型数据,取消对a的引用(*a)得到一个字符,
不取消引用得到一个字符串,printf("%c",*a)输出一个字符或者printf("%s",a)输出字符串;
char **a: a的值包含一个地址,该地址包含字符字符型数据,取消对a的引用(*a),得到该地址,再取消对该地址的引用(**a),得到一个字符,printf("%c",**a)输出一个字符printf("%s",*a)输出字符串;
char *a[]: a是一个数组,数组的元素是地址(地址其实就是指针),地址包含的值是字符型数据,printf("%c",*a[i])输出一个字符,printf("%s",a[i]))输出字符串;
char *a或char **a可以改变a的值,char a*[]不能改变a的值。




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

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

相关文章

javascript设计模式之外观模式

/** 外观模式* 外观模式的主要意义在于简化类的接口,使其易于调用 */// 你常常在不经意中使用了外观模式,尤其类库中更多(处理兼容性问题) var addEvent function (el, ev, fn) {if (el.addEventListener) {el.addEventListener(…

arduino代码_纯纯小白开发arduino--我的调试经验

arduino 是什么我就不做介绍了。这里的小白并不是说我没有嵌入式开发经验而是说从来没有实际开发过arduino。虽然它在世界范围内都很流行,可是不知为何国内专业做嵌入式开发的人对它大多都嗤之以鼻。我对arduino的想法是:”不管黑猫白猫,抓到…

重要的ui组件——Behavior

v7包下的组件类似CoordinatorLayout推出也有一段时间了,大家使用的时候应该会体会到其中很多的便利,今天这篇文章带大家来了解一个比较重要的ui组件——Behavior。从字面意思上就可以看出它的作用,就是用来规定某些组件的行为的,那…

《转》CXF WebService 开发文档-目录索引

CXF WebService 开发文档-目录索引 上次介绍了Axis的WebService,现在我们来看看CXF是怎么完成WebService的。 Axis1 WebService 在线博文: http://www.cnblogs.com/hoojo/archive/2010/12/20/1911349.html Axis2 WebService 在线博文: http:/…

Spark的基本架构

http://ihoge.cn/2018/IntroductionToSpark.html Spark的基本架构 当单机没有足够的能力和资源来执行大量信息的计算(或者低延迟计算),这时就需要一个集群或一组机器将许多机器的资源集中在一起,使我们可以使用全部累积的在一起…

深入 char * ,char ** ,char a[ ] ,char *a[]

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程 1 数组的本质 数组是多个元素的集合,在内存中分布在地址相连的单元中,所以可以通过其下标访问不同单元的元素。 2 指针。 指针也是一种变量,只不过它的内存单元中保…

备份恢复与同步(数据搬运专家)

NewLife.XCode是一个有20年历史的开源数据中间件,支持net6/net5/net45/net40,由新生命团队(2002~2020)开发完成并维护至今,以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含多年开发经验于其中&#…

简析TCP的三次握手与四次分手

TCP是什么? 具体的关于TCP是什么,我不打算详细的说了;当你看到这篇文章时,我想你也知道TCP的概念了,想要更深入的了解TCP的工作,我们就继续。它只是一个超级麻烦的协议,而它又是互联网的基础&am…

for循环延时_前端中的事件循环eventloop机制

我们知道 js 是单线程执行的,那么异步的代码 js 是怎么处理的呢?例如下面的代码是如何进行输出的:console.log(1);setTimeout(function() { console.log(2);}, 0);new Promise(function(resolve) { console.log(3); resolve(Date.no…

由于未分配内存的指针导致段错误

代码如下 #include<iostream> using namespace std;void f(char **s) {*s "chenyu"; }typedef struct _node {int val;struct _node *next; } Node;typedef struct _link {Node *front;Node *rear; } Link;void queue(Link *link) { // link.front link.rear…

androidActivity生命周期

Activity生命周期Activity是一个用来提供用户交互界面的组件&#xff0c;它是四大组件之一&#xff0c;对于我们刚刚学习android的菜鸟来说是非常重要的&#xff0c;我们可以将一个屏幕理解为一个Activity&#xff0c;Activity通常是一个全屏的界面&#xff0c;每一个应用程序可…

Autofac实现有条件的DI

Autofac.Annotation框架是我用.netcore写的一个DI框架&#xff0c;基于Autofac参考 Spring注解方式所有容器的注册和装配,切面,拦截器等都是依赖标签来完成。开源地址&#xff1a;https://github.com/yuzd/Autofac.Annotation本期讲的是最新实现的功能有条件的DI有些时候我们想…

Spark ML - 协同过滤

http://ihoge.cn/2018/ML1.html 协同过滤算法 ​ 获取spark自带的MovieLens数据集&#xff0c;其中每行包含一个用户、一个电影、一个该用户对该电影的评分以及时间戳。我们使用默认的ALS.train() 方法&#xff0c;即显性反馈&#xff08;默认implicitPrefs 为false&#xff…

转:java的各个拓展类库的推荐方案

from: 链接&#xff1a;https://www.zhihu.com/question/21142149/answer/109854408 Java是世界上最强大的编程语言之一&#xff0c;很多开发人员和大型企业都偏爱Java&#xff0c;并且在各种应用场景中使用它。在本文中&#xff0c;我们为大家介绍几种Java库来帮助开发人员解决…

字符串常量到底存放在哪个存储区

字符串常量&#xff0c;放在哪个存储区呢&#xff1f;是“自动存储区”还是“静态存储区”中&#xff1f; 比如&#xff1a; char *pstr"hello world!"; 这里&#xff0c;"hello world!"是一个字符串常量&#xff0c; pstr是在栈中的变量。 我想问&#…

公众平台关注用户达到5万即可开通流量主功能 可以推广APP应用

今天微信公众平台发布发布了一些更新&#xff0c;公众帐号的关注用户达到5万&#xff0c;即可开通流量主功能&#xff0c;之前的是要求10万粉丝&#xff0c;这是一个微信开放的信号。广告主可推广苹果商店应用或腾讯开放平台应用。新增卡片和图文广告规格。以下是微信团队的公告…

二进制全排列 java_排列组合算法真厉害,傻瓜都能学会

作者&#xff1a;枕边书来源&#xff1a;https://zhenbianshu.github.io/2019/01/charming_alg_permutation_and_combination.html需求最近工作中碰到一个需求&#xff1a;我们的数据表有多个维度&#xff0c;任意多个维度组合后进行 group by 可能会产生一些”奇妙”的反应&am…