王道笔记C-day21-字符指针与字符数组的初始化
回顾上节课内容:
虽然前面,讲了很多的一级指针
但是我们练习的场景,指针与后++的关系。
还有指针要申请空间,申请空间,就是在堆空间申请偏移,来放置数据。
当我们讲排序的时候,我们就会使用malloc来申请堆空间,然后放入整数。
puts(c)与puts(p)都可以打hello,那么这两种方式,到底有什么区别呢。
请看原理,在看场景。
根据原理,你来看场景,能不能做?
关键我们不仅仅是初始化
如果char *p=hello ,p是一个指针变量。
此时它只有4个字节,
原理:
字符串常量区有一个hello的字符串,
它有一个地址,它的h有起始地址。
这里是我们的数据段,数据段有字符串常量区,就叫常量区。
p里面存4个字节,实际上这四个字节存储的就是hello的起始地址,
接着你又定义了C[10],它是要占10个字节空间的。你把hello这样给C[10]这样与刚才char*p的作用在于。
strcpy()它把Hello的五个字符呢,依次赋值到栈空间里边。
也就是说,c里边,已经存储了这一份hello了。
那我们都知道栈空间是不是可读可写的。
这是你的数组,这个时候你可以改变
接下来做两件事情。
我想把C[0]改成大写的Hp的地址指向的都是字符串常量区。字符串hello不应该是六个字节么,这里怎么有有个00是空着的?
对齐,结构体会说。C[0]已经是大写的H了,大写的hello了。&c这里是我们的栈空间。
而且P和C距离很近的。
因为他指向的都是字符串常量,所以每一个都不可以改。
p所指向的是字符串常量区
那么字符串常量区,每一个都是不可以更改的。
hello在这里的字符串常量区,是只有一份的 虽然主函数存在两个字符串常量hello,一个是char*p 一个是c[10]。但是你编译的时候,字符串常量区,却是只有一份hello。这就是为什么字符串都要放在字符串常量区的好处。它不会有多份的。这个位置不可以写,固定的。
为什么不可写?
其实你在编译的时候,每个地方替换成hello,实际上是把地址给它在初始化的时候,相当于进行了 strcpystrcpy所要传递的类型,就是字符指针。它是把首地址给你了。你在任何地方写字符串,那都是把首地址给了过去。一旦变化,那么谁在拿首地址,在来访问字符串常量的时候,就不符合预期了。
F10写入发生冲突,就是没有写的权限。这个是不合法的。
所以这就是两种初始化是有区别的。
第二件事
我们知道,原来P指向hello,那么现在我想让P指向word.
现在又想让C也是word。编译不通左操作数,必须为左值。左操作数是不可以修改的,它左边是存储的一个位地址的常量。你可以理解它为地址常量。但是我们的p就可以,因为我们的world.虽然它也是在字符串常量区。刚才说了,任何一个字符串常量,放在这里,它都是一个地址。这个地址是可以赋值给指针变量的。因为指针变量是可以存储hello的地址。它也可以存world的地址。它可以换,所以这个时候,它就可以改变。而C这里就不行。
字符指针和字符数组,它的初始化,是有区别的。你什么时候用什么,依赖于你的需求。
比如,你想做的是,我一开始想去指向的是一个字符串,后来,我又想指向,另外的字符串, 你是字符串之间的不停打印,那么你就用字符指针。这个时候,是不能用字符数组的。
但是如果你是想用,存下的字符串,你把字符串里的每一个字符。要进行修改,处理,那这个时候,肯定不能用字符指针了,那么你字符指针指向的是常量区,那肯定不行。除非你字符指针,你所指向的不是字符串常量区。比如,我们定义一个字符指针。让它直接等于c
这个时候是可以的。它可以进行偏移的去访问,数组的元素是可以修改的。
以上为字符数组的初始化,和字符指针的初始化。一个是指向hello,一个是存储了hello。一个hello在栈,一个hello在数据段。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/97895.html