C/C++ char*、char[]
一、本质区别
char* s是一个保存字符串首地址的指针变量,char a[]是许多连续的内存单元,单元中的元素为char类型。之所以用char *能达到char []的效果,还是字符串的本质,即给你一个字符串地址,便可以随心所欲的操作它。但是,char*和char a[]的本质属性是不一样的。
当定义 char a[10] 时,编译器会给数组分配十个单元,每个单元的数据类型为字符。而定义 char* s 时,这是个指针变量,只占四个字节,32位,用来保存一个地址,如:
printf("%p",s);//这个表示 s 的单元中所保存的地址。
printf("%p",&s);//这个表示变量本身所在内存单元地址。
二、具体分析
例1:
char *s1 = "hello";
char s2[100] = "hello";
//s1指向的内存区域可以改变,而且指向常量字符串时,它的内容是不可以被部分修改的(不能以s1[x]='y'的形式修改,可以以s1[x]的形式来使用,跟数组一样;但整体可以修改,如s1=“dasdasd”就可以)。
//s2指向的内存区域的地址和容量在生命期里不会改变,但数组里存的内容可以改变。(两者在内存里都在末位存了‘\0’,但strlen()时不计‘\0’。上述s1,s2的strlen()都是5)
s2=s1;
//错,s2的地址不能变,即数组不能用等号赋值(除了初始化)
s1=s2;//对,相当于普通的非数组变量赋值
例2:
char *s1 和 char s2[]相同的地方(编译器对char[]做了隐式变化):
1)作为形参完全相同,如:
void function(char *s1);
void function(char s1[]);
2)只使用不修改,如:
char *s1="hello";
char s2[]="hello";
printf("s1[1]=[%c]\n",s1[1]); //s1[1]=[e]
printf("s2[1]=[%c]\n",s2[1]); //s2[1]=[e]
printf("s1=[%s]\n",s1); //s1=[hello]
printf("s2=[%s]\n",s2); //s2=[hello]
例3:
char str[10] = {"hello world"};
printf("%s",str); //用首地址就可以输出字符串,因为在C语言中字符串常量的本质表示其实是一个地址
char *s ;
s = "hello";
把一个字符串赋给一个指针变量居然没出错,这是因为c语言中编译器会给字符串常量分配地址,字符串常量的本质表示其实是一个地址。如果"hello"存储在内存中的 0x2000 0x2001 0x2002 0x2003 0x2004 0x2005 。
s = "hello" ,就是把“hello”的首地址给了s,其实真正的意义是 s ="hello" = 0x2000;
我们将“hello”看作是字符串,但是编译器把它看作是地址 0x2000,即字符串常量的本质表现是代表它的第一个字符的地址。
那么 %s ,它的原理其实也是通过字符串首地址输出字符串,printf("%s ", s); 所以,printf("%s",地址);也是等效的。
C/C++ char*、char[]的更多相关文章
- const char*、char*、char* const、char[]、string的区别
1.const char* p: p is a pointer to const char(char const* p 一样) 意思就是不能通过p指针来修改p指向的内容(但是内容可以修改). 2. ...
- string、const char*、 char* 、char[]相互转换(待整理)
string.const char*. char* .char[]相互转换(全) https://blog.csdn.net/rongrongyaofeiqi/article/details/5244 ...
- C++ 字符串、string、char *、char[]、const char*的转换和区别
1.字符串 字符串本质就是一串字符,在C++中大家想到字符串往往第一反应是std::string(后面简称string) 字符串得从C语言说起,string其实是个类,C语言是没有class的,所以C ...
- C++中string、char *、char[]的转换
头段时间有人问过我这个问题,可是我一点头绪都没有,直接说不会.现在从网上找了点资料,看了看,知道点东西了. 一.string转char*. 主要有三种方法可以将str转换为char*类型,分别是:da ...
- string、const char*、 char* 、char[]相互转换
转化总结如下: 目标格式 源格式 string const char* char* char[] string NULL const char*=string.c_str(); const char* ...
- 理解C/C++中const char*、char* const、const char* const、char* const*等等
先说些题外话,今天学习execve(2)的使用,由于书上代码使用的是C89标准,所以下面这种代码都被我修改了 char* s[] = { "aaa", "bbb" ...
- 转载:string、const char*、 char* 、char[]相互转换
本文转自:https://blog.csdn.net/rongrongyaofeiqi/article/details/52442169 一:转化总结形式如下: 使用时,要对源格式和目标格式进行初始化 ...
- Java JNA (四)—— void**、void*、char**、char*、int*等类型映射关系及简单示例
ByReference类有很多子类,这些类都非常有用. ByteByReference.DoubleByReference.FloatByReference. IntByReference.LongB ...
- string 、char* 、 char []的转换
1.string->char* (1)data string s = "goodbye"; const char* p=str.data(); (2)c_str() stri ...
随机推荐
- bzoj 1266 [AHOI2006] 上学路线 route 题解
转载请注明:http://blog.csdn.net/jiangshibiao/article/details/23989499 [原题] 1266: [AHOI2006]上学路线route Time ...
- 连通分量模板:tarjan: 求割点 && 桥 && 缩点 && 强连通分量 && 双连通分量 && LCA(近期公共祖先)
PS:摘自一不知名的来自大神. 1.割点:若删掉某点后.原连通图分裂为多个子图.则称该点为割点. 2.割点集合:在一个无向连通图中,假设有一个顶点集合,删除这个顶点集合,以及这个集合中全部顶点相关联的 ...
- Cocos2D实现上下滚动式状态窗体
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 假设认为写的不好请多提意见,假设认为不错请多多支持点赞.谢谢! hopy ;) 有时候要显示的内容太多,我们无法在iOS设备的小屏幕上显示出来 ...
- java struts jxl 导入导出Excel(无模板)
jar包: import javax.servlet.http.HttpServletResponse; import java.io.OutputStream; import java.io.Fil ...
- SDK Manager配置
改Host的都是扯淡,现在不好使了.. 还是使用东软的国内镜像好使,打开SDK Manager Tools - Options Http proxy Server: mirrors.neusoft. ...
- USACO Section 1.2PROB Miking Cows
贪心做过去,先对每个时间的左边点进行排序,然后乱搞,当然线段树也可以做 /* ID: jusonal1 PROG: milk2 LANG: C++ */ #include <iostream&g ...
- 洛谷 P1181,1182 数列分段Section
数列分段Section I 题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成连续的若干段,并且每段和不超过M(可以等于M),问最少能将其分成多少段使得满足要求. 输入输出格式 输入格 ...
- robo 3t 在 ubuntu下安装
如果您尝试安装最新版本robomobo调用可以现在robo3t.或者你尝试在Ubuntu 16.04上安装,按照下面的步骤和你的robomongo安装 下载最新的robomongo tar文件 wge ...
- android developer官网不能打开怎么办
映射网站: http://wear.techbrood.com
- 【LNOI 2014】 LCA
[题目链接] 点击打开链接 [算法] 考虑求lca(x,y)的深度 我们可以将从根到x路径上的点都打上标记,然后,询问y到根上路径的权值和 那么,求sigma(depth(lca(i,z)))(l & ...