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 ...
随机推荐
- hadoop的linux配置
一.新建hadoop组跟用户(password:hadoop) [root@localhost home]# groupadd hadoop [root@localhost home]# userad ...
- REST技术第二步 获取URL中的參数
获取请求的參数.rest技术相对于servlet来说要方便很多. Servlet我们要获取请求的參数,非常麻烦啊.须要request.getParameter("").假设我们要的 ...
- poj1151==codevs 3044 矩形面积求并
Atlantis Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 21511 Accepted: 8110 Descrip ...
- clojure学习记录
take 从列表中获取子列表 into a b 把b conj 到a中 (defn count-a-seq [lat] (reduce (fn [x y] (+ x 1)) 0 lat)) red ...
- 关于Web API中使用ajax发送请求方式的问题
参见以下文章 http://www.west-wind.com/weblog/posts/2012/May/08/Passing-multiple-POST-parameters-to-Web-API ...
- Tiny4412汇编流水灯代码,Tiny4412裸机LED操作【转】
本转载自:http://www.techbulo.com/1313.html Tiny4412汇编流水灯代码,Tiny4412裸机LED操作 2014年10月20日 ⁄ 裸机程序 ⁄ 共 4171字 ...
- Size Classes with Xcode 6:为所有的尺寸准备一个Storyboard
我最喜欢的Xcode6的特性是新的size classes 概念,有了它,我们解决了“我如何能够快速的为那么多不同尺寸屏幕以及方向的设备写app”.他们也让在一个storyboard中创建一个通用的a ...
- 【POJ 3233】Matrix Power Series
[题目链接] 点击打开链接 [算法] 要求 A^1 + A^2 + A^3 + ... + A^k 考虑通过二分来计算这个式子 : 令f(k) = A^1 + A^2 + A ^ 3 + ... + ...
- window系统 查看端口 被哪个进程占用了
一.在windows命令行窗口下执行:运行--cmdC:\>netstat -aon|findstr "8080" TCP 127.0.0.1:80 0. ...
- Centos7 配置防火墙 firewall
一.firewall 1.从CentOS7开始,默认使用firewall来配置防火墙,没有安装iptables(旧版默认安装). 2.firewall的配置文件是以xml的格式,存储在 /usr/li ...