char *str1 和 char str2[]的详解
点击打开链接
char *str1 = "hello world" 和 char str2[] = "hello world"; 的区别:
1、内存管理:
内存分为:只读代码段,只读数据段,BSS,堆,栈五个不同区域。
如上图所示:
只读代码段一般存放的是编写好的程序。
只读数据段(常量存储区)放的是常量(字符串常量,数组名称,函数名称),只读区域不能更改!
SS区域(全局/静态存储区)存放的是全局变量和static静态类变量,又分为未初始化,值都为0,和已初始化区域。
堆中存放的是malloc(),calloc()……(new)申请的空间,不由操作系统回收,必须靠程序员自己通过free()回收空间,不然就是内存泄漏!!!
栈中存放的是局部变量,形参变量,栈中空间可被任何函数使用,是数据的可靠性很低!
2、str1是指针变量,str1++; right,指针加减整型,结果还是指针。
对于str2而言,char str2[] = "hello world"; <=>
char str2[] = {‘h‘, ‘e‘, ‘l‘, ‘l‘, ‘o‘, ‘ ‘, ‘w‘, ‘o‘, ‘r‘, ‘l‘, ‘d‘, ‘\0‘};
这是对字符数组初始化,所以str2是数组名称(指针常量),str2++;false,常量不能赋值!
"hello world"字符串本身就是以'/0'结尾的字符数组!!!
3、"hello world"字符串常量在只读数据段,值本身内容不能被更改!!!
str1为指针变量,*str1 =‘t‘; false,更改的是只读数据段中的区域。
str2为数组名称,其空间在栈中申请,*str2 = ‘t‘; true,栈中的数据可以被更改。
4、对char *str1 = "hello world"的深刻理解
strlen(str1); //11
strlen(str2); //11
sizeof(str2); //12
数组名称,求字节数,是数组所申请的空间的字节数,再加上'/0'结束标志。
sizeof(str1); //4/8 与平台有关,32位系统下,指针4字节;64位,指针8字节
sizeof(*str1); //1 *str1 就是‘h‘,占用一个字节。
sizeof("hello world"); //12 字符串常量所占空间
strlen();函数,求得是字符串长度,不算那个'/0';
sizeof();关键字,单目运算符,求字节数,算字符串的结束标志'/0'。
5、[]中的值,由初值个数决定。
char str1[]="hello";//str1!=str2
char str2[]="hello";
char *str3="hello";//str3==str4
char *str4="hello";
char *str1 和 char str2[]的详解相关推荐
- c语言中argc的作用,C语言中 int main(int argc,char *argv[])的两个参数详解
C语言中 int main(int argc,char *argv[])的两个参数详解 argc是命令行总的参数个数: argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数.命令行后面 ...
- 【转载】cocos2d-x类型转换(CCstring int string char UTF-8互转)以及字符串详解
cocos2d-x中的字符串: <1>:使用 const char* 和 std::string const char* 是C风格的字符串 ,std::string 是C++风格的字符串 ...
- C语言的变量类型(int、short、char、float...)及变量类型转换详解
前言 单片机的基本功能是进行数据处理,而数据在进行处理时需要先存放到单片机的存储器中.所以在编写程序时对变量与常量都要先声明数据类型,以便把不同的数据类型定位到嵌入式处理器的不同存储区中. 具有一定格 ...
- C语言常用字符串操作函数大全详解(strstr,strtok,strrchr,strcat,strcmp,strcpy,strerror,strspn,strchr等)
参考:string.h中常用字符串操作函数说明(strstr,strtok,strrchr,strcat,strcmp,strcpy,strerror,strspn,strchr等) 作者:一只青木呀 ...
- C 和 C++字符串详解
From:http://blog.csdn.net/fenxinzi557/article/details/51457829 From:http://www.cnblogs.com/xFreedom/ ...
- C++ cin 详解之终极无惑
代码编译运行环境:VS2017+Win64+Debug. 文章目录 1.简介 2.常用输入方法 2.1 cin>> 的用法 2.2 cin.get() 的用法 2.2.1 cin.get( ...
- Linux C 字符串输入函数 gets()、fgets()、scanf() 详解
一.gets() 函数详解 gets()函数用来从 标准输入设备(键盘)读取字符串直到 回车结束,但回车符('\n')不属于这个字符串. 调用格式为: gets(str); 其中str为字符串变量(字 ...
- python中get函数是什么意思_详解python中get函数的用法(附代码)_后端开发
strncmp函数用法详解_后端开发 strncmp函数为字符串比较函数,其函数语法为"int strncmp ( const char * str1, const char * str2, ...
- 筑基九层 —— 指针详解
目录 前言: 指针详解 前言: 1.CSDN由于我的排版不怎么好看,我的有道云笔记比较美观,请移步有道云笔记 2.修炼必备 1)入门必备:VS2019社区版,下载地址:Visual Studio 较旧 ...
最新文章
- mysql索引教程_MySQL教程96-MySQL索引类型
- c++ Resource file and Source file
- vue-router的基本使用
- 【转/TCP协议编程】 基于TCP的Socket 编程
- 【Python】Python处理图像五个有趣场景,很实用!
- Istio 自动注入 sidecar 不成功及k8s安装istio后pod无法创建解决方案
- Java Windows 环境配置
- java面试题23 牛客ArrayLists和LinkedList的区别,下述说法正确的有?
- java获取s3对象url_java-如何通过SDK设置S3对象的内容类型?
- 计算机网络实用技术教学资源,计算机网络实用技术第一章课件教学.ppt
- Objective-C(9)内存管理之ARC
- linux 按序号创建文件夹,在Linux终端中创建M3U播放列表的方法
- Windows 安装配置Java开发环境《jdk8》
- win10未能连接网络连接到服务器,win10以太网无法连接网络解决办法
- 卫星对地观察模型系统操作说明
- 使用vue-giant-tree根据id定位位置
- ESXI VIB升级报错
- MVC下压缩输入的HTML内容
- 19-windows10窗口关闭延迟解决
- uni-app学习笔记-实现一个简单统计图(三)
热门文章
- win7你没有权限查看或编辑这个对象的权限设置
- 高中数学知识点;二次函数与幂函数(高考备考)
- 虾皮规模毁约、毁 offer,操作太离谱了...
- SAP-READ语句
- android 音量 广播,Android平台音量调节(一)音量键调节音量
- Neighbourhood Consensus Networks
- ntp linux 是什么意思,【NTP】Linux NTP
- mysql匿名用户grant_mysql 建库报匿名用户权限错误
- Mathematica 和 MATLAB、Maple 并称为三大数学软件
- 计算机二级60分容易吗,计算机二级哪个比较容易考