一、本质区别

  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[]的更多相关文章

  1. const char*、char*、char* const、char[]、string的区别

    1.const char* p: p is a pointer to const char(char const* p 一样)   意思就是不能通过p指针来修改p指向的内容(但是内容可以修改). 2. ...

  2. string、const char*、 char* 、char[]相互转换(待整理)

    string.const char*. char* .char[]相互转换(全) https://blog.csdn.net/rongrongyaofeiqi/article/details/5244 ...

  3. C++ 字符串、string、char *、char[]、const char*的转换和区别

    1.字符串 字符串本质就是一串字符,在C++中大家想到字符串往往第一反应是std::string(后面简称string) 字符串得从C语言说起,string其实是个类,C语言是没有class的,所以C ...

  4. C++中string、char *、char[]的转换

    头段时间有人问过我这个问题,可是我一点头绪都没有,直接说不会.现在从网上找了点资料,看了看,知道点东西了. 一.string转char*. 主要有三种方法可以将str转换为char*类型,分别是:da ...

  5. string、const char*、 char* 、char[]相互转换

    转化总结如下: 目标格式 源格式 string const char* char* char[] string NULL const char*=string.c_str(); const char* ...

  6. 理解C/C++中const char*、char* const、const char* const、char* const*等等

    先说些题外话,今天学习execve(2)的使用,由于书上代码使用的是C89标准,所以下面这种代码都被我修改了 char* s[] = { "aaa", "bbb" ...

  7. 转载:string、const char*、 char* 、char[]相互转换

    本文转自:https://blog.csdn.net/rongrongyaofeiqi/article/details/52442169 一:转化总结形式如下: 使用时,要对源格式和目标格式进行初始化 ...

  8. Java JNA (四)—— void**、void*、char**、char*、int*等类型映射关系及简单示例

    ByReference类有很多子类,这些类都非常有用. ByteByReference.DoubleByReference.FloatByReference. IntByReference.LongB ...

  9. string 、char* 、 char []的转换

    1.string->char* (1)data string s = "goodbye"; const char* p=str.data(); (2)c_str() stri ...

随机推荐

  1. bzoj 1266 [AHOI2006] 上学路线 route 题解

    转载请注明:http://blog.csdn.net/jiangshibiao/article/details/23989499 [原题] 1266: [AHOI2006]上学路线route Time ...

  2. 连通分量模板:tarjan: 求割点 && 桥 && 缩点 && 强连通分量 && 双连通分量 && LCA(近期公共祖先)

    PS:摘自一不知名的来自大神. 1.割点:若删掉某点后.原连通图分裂为多个子图.则称该点为割点. 2.割点集合:在一个无向连通图中,假设有一个顶点集合,删除这个顶点集合,以及这个集合中全部顶点相关联的 ...

  3. Cocos2D实现上下滚动式状态窗体

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 假设认为写的不好请多提意见,假设认为不错请多多支持点赞.谢谢! hopy ;) 有时候要显示的内容太多,我们无法在iOS设备的小屏幕上显示出来 ...

  4. java struts jxl 导入导出Excel(无模板)

    jar包: import javax.servlet.http.HttpServletResponse; import java.io.OutputStream; import java.io.Fil ...

  5. SDK Manager配置

    改Host的都是扯淡,现在不好使了.. 还是使用东软的国内镜像好使,打开SDK Manager Tools - Options Http proxy Server:  mirrors.neusoft. ...

  6. USACO Section 1.2PROB Miking Cows

    贪心做过去,先对每个时间的左边点进行排序,然后乱搞,当然线段树也可以做 /* ID: jusonal1 PROG: milk2 LANG: C++ */ #include <iostream&g ...

  7. 洛谷 P1181,1182 数列分段Section

    数列分段Section I 题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成连续的若干段,并且每段和不超过M(可以等于M),问最少能将其分成多少段使得满足要求. 输入输出格式 输入格 ...

  8. robo 3t 在 ubuntu下安装

    如果您尝试安装最新版本robomobo调用可以现在robo3t.或者你尝试在Ubuntu 16.04上安装,按照下面的步骤和你的robomongo安装 下载最新的robomongo tar文件 wge ...

  9. android developer官网不能打开怎么办

    映射网站: http://wear.techbrood.com

  10. 【LNOI 2014】 LCA

    [题目链接] 点击打开链接 [算法] 考虑求lca(x,y)的深度 我们可以将从根到x路径上的点都打上标记,然后,询问y到根上路径的权值和 那么,求sigma(depth(lca(i,z)))(l & ...