@rjsp
char chr[6] = "Hello\0";
"Hello\0" 是7个字符组成的字符数组,你的 char chr[6] 装不下
我刚开始想用char chr[6]={'H','e','l','l','o','\0'}的,但是这样写麻烦,我就直接用"Hello"或"Hello\0",选择第二个,没想到实际存的是{'H','e','l','l','o','\0','\0'},当时我还以为“赋值的字符串如果后面已经加了\0则不会自动加\0,如果后面没\0则自动加\0”呢。
char chr[6] = "Hello\0"; char *zzChr; zzChr = &chr;
&chr 的类型是 char (*)[6],它无法给 char* 赋值
&是引用的意思!是获取变量存储在内存中的位置的!仔细“审题”!
1. *zhizhen 返回16(zhizhen对应值,也就是x的值)
*zhizhen 返回x的引用
不是返回x的对应值吗?
2. 直接用zhizhen,没星号的话,会返回存储地址;
那 zhizhen = nullptr; 岂不是变成了把一个地址变为0?
对的。我下面就说了可以指向为NULL,跟你的nullptr常量一个意思。
3. 要想对zhizhen的对应值赋值,前面必有星号,若无星号,则改变了地址,值也变得很杂乱了;如果改变地址后再改变对应值,可能会对系统造成暂时损伤。
直接说这里的 * 是“解引用”符
懂了,原来这里星号叫“解引用符”,网上的C++教程都没讲。但是不能“直接说”啊,还要说意思、举例啊!怕小白听不懂
4. 执行 *zhizhen++ 会把zhizhen的对应值加一并赋值,赋值时a(指向的变量)的值也会变;但你把 *zhizhen++ 去掉星号(成zhizhen++),会改变zhizhen指向的地址。
直接说,根据优先级定义 *zhizhen++ 被解释为 *(zhizhen++)
什么?优先级?我又没看优先级。算了,凡是我说的“*zhizhen++”都把它看成“(*zhizhen)++”,算作“a++”(对应变量赋值)吧。
7. 为什么不能直接int *zhizhen = &a;呢?因为不是说了吗,有星号是对应值,无星号是指针地址,如果这样的话,会把a的位置赋值到内存中一个不知道干嘛的地方,可能会对系统造成损伤。
能的。int *zhizhen = &a; 是由定义语句 int* zhizhen; 与执行语句 zhizhen = &a; 复合而成
那你还说“&chr 的类型是 char (*)[6],它无法给 char* 赋值”!
8. 考考大家,为什么*(zzChr + 2) 相当于 *zzChr[2]呢?
不相当于,而是 *(zzChr + 2) 相当于 zzChr[2]。
另外这一点没法考,因为它是C/C++标准规定的语法糖。标准规定,对于内建数组(不是内建数组的话,可能会重载operator[]),a[b] 等同于 *(a+b),所以
zzChr[2] 等同于 *(zzChr+2) 也等同于 *(2+zzChr) 也等同于 2[zzChr]。
“不相当于,而是 *(zzChr + 2) 相当于 zzChr[2]。” 为什么不要加星号(那个“解引用符”)呢?
我是到[url=https://www.]这里(https://www.)[/url]学的,还以为完全懂了,实则一知半解。
[此贴子已经被作者于2022-8-5 20:30编辑过]