char *str1 和 char str2[]的详解

C语言的一个知识点:

char *str1 = "hello world" 和 char str2[] = "hello world"; 的区别:

1、内存管理:

内存分为了:只读代码段,只读数据段,BSS,堆,栈五个不同区域。

如上图所示: 只读代码段一般存放的是编写好的程序。

只读数据段放的是常量(字符串常量,数组名称,函数名称),只读区域不能更改!

BSS区域存放的是全局变量和static静态类变量,又分为未初始化,值都为0,和已初始化区域。

堆中存放的是malloc(),calloc()……申请的空间,不由操作系统回收,必须靠程序员自己通过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、[]中的值,由初值个数决定。

时间: 2024-12-04 18:56:35

char *str1 和 char str2[]的详解的相关文章

【转载】cocos2d-x类型转换(CCstring int string char UTF-8互转)以及字符串详解

cocos2d-x中的字符串: <1>:使用 const char* 和 std::string const char* 是C风格的字符串  ,std::string 是C++风格的字符串,它封装了 const char * 初始化 std::string 对象: std::string name = "tony"; std:: string name = std::string("Micheal"); std::string 指针类型: std::st

20160214.CCPP体系详解(0024天)

程序片段(01):CGI.c 内容概要:CGI-cloud #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main01(void) { printf("Content-Type:text/html \n\n"); printf("周瑞富很富,吴伟很帅,刘海华很高!并称高富帅! <br />"); printf("周瑞富很富,吴伟很帅,刘海华很高!并称高富帅! <b

《招一个靠谱的移动开发》iOS面试题及详解(上篇)

多线程.特别是NSOperation 和 GCD 的内部原理. 运行时机制的原理和运用场景. SDWebImage的原理.实现机制.如何解决TableView卡的问题. block和代理的,通知的区别.block的用法需要注意些什么. strong,weak,retain,assign,copy nomatic 等的区别. 设计模式,mvc,单利,工厂,代理等的应用场景. 单利的写法.在单利中创建数组应该注意些什么. NSString 的时候用copy和strong的区别. 响应值链. NSTi

c语言scanf详解

函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]);scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息.可以读入任何固有类型的数据并自动把数值变换成适当的机内格式.其调用格式为:      scanf("<格式化字符串>",<地址表>);scanf()函数返回成功赋值的数据项数,出错时则返回EOF.其控制串由三类字符构成:1.格式化说明符: 2.

char *p 与char p[] 比较

所有的字符窜常量都被放在静态内存区 因为字符串常量很少需要修改,放在静态内存区会提高效率 例: char str1[] = "abc"; char str2[] = "abc"; const char str3[] = "abc"; const char str4[] = "abc"; const char *str5 = "abc"; const char *str6 = "abc";

C语言scanf函数详解

函数名: scanf 功 能: 运行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息.能够读入不论什么固有类型的数据并自己主动把数值变换成适当的机内格式. 其调用格式为:      scanf("<格式化字符串>",<地址表>); scanf()函数返回成功赋值的数据项数,出错时则返回EOF. 其控制串由三类字符构成: 1.格

c语言字符数组与字符串的使用详解

转自:http://www.jb51.net/article/37456.htm 1.字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素.char str[10]={ 'I',' ','a','m',' ',‘h','a','p','p','y'};即把10个字符分别赋给str[0]到str[9]10个元素如果花括号中提供的字符个数大于数组长度,则按语法错误处理:若小于数组长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即 '\0' ). 2.

C++经典笔试题详解

1.static有什么用途?(请至少说明两种) 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变. 2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问.它是一个本地的全局变量. 3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用.那就是,这个函数被限制在声明它的模块的本地范围内使用 2.引用与指针有什么区别? 1) 引用必须被初始化,指针不必. 2) 引用初始化以后不能被改变,指针可以改变所指的对象.

scanf函数详解

函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]);scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息.可以读入任何固有类型的数据并自动把数值变换成适当的机内格式.其调用格式为:      scanf("<格式化字符串>",<地址表>);scanf()函数返回成功赋值的数据项数,出错时则返回EOF.其控制串由三类字符构成:1.格式化说明符: 2.