首先我们需要知道主要的数据存储位置
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”
网友评论