C解析字符串的存储,char *str和char str[]分析

首先我们需要知道主要的数据存储位置

**1、栈(动态存储方式,如局部变量,用完自动销毁)
2、堆(如malloc申请内存,用完需要手动回收内存)
3、静态存储区(静态存储方式,全局变量和静态变量,程序开始就一直存在)
4、常量存储区(里面存放的是常量,不允许修改)**

有这些基本知识后,接下来进一步分析

char *str = "hello";

解析:
str是一个char型指针变量,它指向常量”hello”字符串所在的首地址
①:变量str保存在栈上
②:常量”hello”即保存在常量存储区

恩,我想把第一个字符改成’a’

*str='a';

很明显,这样会报错,因为常量不能改变,”hello”保存在内存常量区,程序编译完成时,这个值就确定了不能改变。

接下来

char str[] = "hello";

解析:
str是数组名,它是一个指针,指向变量”hello”字符串的首地址
①:str我们把它理解是数组名,是一个指针常量(注意不是变量,只是数组名的命名方法和变量一样!!)
②:字符串”hello”,保存在栈上

恩,我自增一下

str++;

很明显,str++;是错误的语法,因为不是变量(这里需要注意:char str[] 作参数时,char str[]是当做char *str使用,即str++不会报错 )

str+1;

str+1;是没问题,因为str是指针,所以+1就是偏移char个宽度,指向下一个字节的地址

&str

&str对数组名取地址,即&str是代表整个数组的地址。&str是一个宽度是数组的长度(即sizeof(str))的指针。

*str='a';

改变第一个字符的值,因为是变量,没问题。字符成为“aello”

おすすめ

転載: blog.csdn.net/haha1fan/article/details/73732893