看图说话来讨论char内存的问题
本帖最后由 howzyao 于 2022-9-20 18:06 编辑如上图,
1, 指针地址,指针固定是4字节,是单独的空间;
2, abcefg 是右值,首地址是31
3, 可以数出 31地址占用内存的长度,是6个字符+1个''\0'' 共7个char长度
4, 指向 首地址 *p =='a'
5, 让指针指向这个31地址,无论31多长,也是没有问题;
6, 31地址 +1字节 到了32地址 为什么32地址 能储存字符b?
疑问是6:
红线处32地址中的字符b,为什么能被 p访问?
那没有p 字符c是否能被p访问?
另:
大家截图中发现%c 格式 访问p时,出现的不是地址,而是"偏移量1"没有?这个机制怎么讲?
望知道的坛友能跟贴教学,谢谢.
看来还是可以的. 本帖最后由 howzyao 于 2022-9-20 18:23 编辑
最后,通过本节的分析,得到剖析图: 其中有没有错误的地方,对不对,欢迎大家指出来.为谢.
本帖最后由 jackz007 于 2022-9-20 18:24 编辑
地址 31 可以储存 'a' ,那么,32 为何不可以储存 'b' ? p 是 char * 其步进单位是 1 个 char,* p 或者 p 是 'a',* (p + 1) 或者 p 当然就是 'b' 了,这还能有什么疑问?同样的道理,* (p + 2) 或者 p 毫无疑问就是 'c' 了。
%c 是按字符显示,意思是,把整型数作为 ASCII 编码,显示其对应的 ASCII 字符,%d 是按十进制显示,意思是按十进制显示整型数,%p 是把整型数显示为十六进制数。%s 比较特殊,是把整型数作为内存地址,从前往后逐个按字符(%c)显示内存中的数字,直到遇到字符串结束标志字符 '\0'。 jackz007 发表于 2022-9-20 18:22
地址 31 可以储存 'a' ,那么,32 为何不可以储存 'b' ? p 是 char * 其步进单位是 1 个 char,* p...
p 是 char * p 步进单位是 1 个 char
这时,是不是就可以理解为之前 声明的&p的地址和长度,这个空间,就与31这里无关了? 本帖最后由 jackz007 于 2022-9-20 18:38 编辑
howzyao 发表于 2022-9-20 18:26
这时,是不是就可以理解为之前 声明的&p的地址和长度,这个空间,就与31这里无关了?
完全听不懂你在说什么,什么就"与 31 无关了"
你通过 new 分配到的 2 字符的存储空间从 31 开始,而 p 的数值就是这个 31,这算不算有关系? jackz007 发表于 2022-9-20 18:36
完全听不懂你在说什么,什么就"与 31 无关了"
你通过 new 分配到的 2 字符的存储空 ...
通过 new 分配到的 2 字符的存储空间从 31 开始
怪我没有标出来,第一行,FF1C的这个地址,是存放p的地址,那么p现在的空间,是不是从
FF1C -> FF1D 2个字节,p此时是 首地址,我开始,是这样理解的,我再用memcpy对这2个字节的空间复制的实验一下看看是不是这样. 本帖最后由 jackz007 于 2022-9-20 19:09 编辑
你要搞清楚的是,p 是一个指针,存放 p 和存放 int、float 都一样,需要 4 个字节的空间,它和你申请的 2 个字符的字符串空间没有关系,只不过 p 的数值正好是字符串空间的开头地址,p 是变量,可以被任意改变,这一点和 char s[] = 'abcdefg' 中的 s 有所不同,s 是常量指针,其数值和字符串的存储空间地址是绑定的,并且,在代码被编译的时候就已经被确定,所以,s 的值是不可更改的,但是 s 和 p 的用法却是完全一样的,把 p 指向 s 后,p 就是 s,p 就是 s。 本帖最后由 howzyao 于 2022-9-20 19:12 编辑
jackz007 发表于 2022-9-20 18:36
完全听不懂你在说什么,什么就"与 31 无关了"
你通过 new 分配到的 2 字符的存储空 ...
完全听不懂你在说什么
我这是这个意思.
我是说,p == p 的 解除引用地址操作(*p) :代表了地址是实际的.
页:
[1]