howzyao 发表于 2022-9-20 18:05:04

看图说话来讨论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:09:24


看来还是可以的.

howzyao 发表于 2022-9-20 18:22:15

本帖最后由 howzyao 于 2022-9-20 18:23 编辑

最后,通过本节的分析,得到剖析图: 其中有没有错误的地方,对不对,欢迎大家指出来.为谢.

jackz007 发表于 2022-9-20 18:22:38

本帖最后由 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'。

howzyao 发表于 2022-9-20 18:26:47

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:36:35

本帖最后由 jackz007 于 2022-9-20 18:38 编辑

howzyao 发表于 2022-9-20 18:26
这时,是不是就可以理解为之前 声明的&p的地址和长度,这个空间,就与31这里无关了?

         完全听不懂你在说什么,什么就"与 31 无关了"
         你通过 new 分配到的 2 字符的存储空间从 31 开始,而 p 的数值就是这个 31,这算不算有关系?

howzyao 发表于 2022-9-20 18:52:42

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 18:59:32

本帖最后由 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:09:01

本帖最后由 howzyao 于 2022-9-20 19:12 编辑

jackz007 发表于 2022-9-20 18:36
完全听不懂你在说什么,什么就"与 31 无关了"
         你通过 new 分配到的 2 字符的存储空 ...

完全听不懂你在说什么



我这是这个意思.
我是说,p == p 的 解除引用地址操作(*p) :代表了地址是实际的.
页: [1]
查看完整版本: 看图说话来讨论char内存的问题