标题:指针的小知识
只看楼主
chenyucheng
Rank: 3Rank: 3
来 自:浙江省台州市临海市
等 级:论坛游侠
威 望:3
帖 子:141
专家分:181
注 册:2022-7-1
结帖率:100%
已结贴  问题点数:5 回复次数:6 
指针的小知识
以下设 int x = 16; int *zhizhen; zhizhen = &a;
char chr[6] = "Hello\0"; char *zzChr; zzChr = &chr;

1. *zhizhen 返回16(zhizhen对应值,也就是x的值);
2. 直接用zhizhen,没星号的话,会返回存储地址;
3. 要想对zhizhen的对应值赋值,前面必有星号,若无星号,则改变了地址,值也变得很杂乱了;如果改变地址后再改变对应值,可能会对系统造成暂时损伤。
4. 执行 *zhizhen++ 会把zhizhen的对应值加一并赋值,赋值时a(指向的变量)的值也会变;但你把 *zhizhen++ 去掉星号(成zhizhen++),会改变zhizhen指向的地址。
5. 指针变量进行++,没有星号,会把指向位置加上它的数据长度并改变。通常用于数组。比如zzChr++会把它指向字符串下一个位置,原先*zzChr的值是'H',现在是'e'。
6. 指针可指向NULL常量值,表示空。
7. 为什么不能直接int *zhizhen = &a;呢?因为不是说了吗,有星号是对应值,无星号是指针地址,如果这样的话,会把a的位置赋值到内存中一个不知道干嘛的地方,可能会对系统造成损伤。
8. 考考大家,为什么*(zzChr + 2) 相当于 *zzChr[2]呢?(假设zzChr的地址还是chr数组的地址,没进行改变)
搜索更多相关主题的帖子: 地址 改变 指针 对应 赋值 
2022-08-05 09:44
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
char chr[6] = "Hello\0";
"Hello\0" 是7个字符组成的字符数组,你的 char chr[6] 装不下

char chr[6] = "Hello\0"; char *zzChr; zzChr = &chr;
&chr 的类型是 char (*)[6],它无法给 char* 赋值

1. *zhizhen 返回16(zhizhen对应值,也就是x的值)
*zhizhen 返回x的引用

2. 直接用zhizhen,没星号的话,会返回存储地址;
那 zhizhen = nullptr; 岂不是变成了把一个地址变为0?

3. 要想对zhizhen的对应值赋值,前面必有星号,若无星号,则改变了地址,值也变得很杂乱了;如果改变地址后再改变对应值,可能会对系统造成暂时损伤。
直接说这里的 * 是“解引用”符

4. 执行 *zhizhen++ 会把zhizhen的对应值加一并赋值,赋值时a(指向的变量)的值也会变;但你把 *zhizhen++ 去掉星号(成zhizhen++),会改变zhizhen指向的地址。
直接说,根据优先级定义 *zhizhen++ 被解释为 *(zhizhen++)

7. 为什么不能直接int *zhizhen = &a;呢?因为不是说了吗,有星号是对应值,无星号是指针地址,如果这样的话,会把a的位置赋值到内存中一个不知道干嘛的地方,可能会对系统造成损伤。
能的。int *zhizhen = &a; 是由定义语句 int* zhizhen; 与执行语句 zhizhen = &a; 复合而成

8. 考考大家,为什么*(zzChr + 2) 相当于 *zzChr[2]呢?
不相当于,而是 *(zzChr + 2) 相当于 zzChr[2]。
另外这一点没法考,因为它是C/C++标准规定的语法糖。标准规定,对于内建数组(不是内建数组的话,可能会重载operator[]),a[b] 等同于 *(a+b),所以
zzChr[2] 等同于 *(zzChr+2) 也等同于 *(2+zzChr) 也等同于 2[zzChr]。

2022-08-05 10:38
chenyucheng
Rank: 3Rank: 3
来 自:浙江省台州市临海市
等 级:论坛游侠
威 望:3
帖 子:141
专家分:181
注 册:2022-7-1
得分:0 
@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编辑过]


爱玩编程的小学生,有Python,但只会一点点C++。

版主->斑竹->竹子,所以版主是竹子。(doge)
//不要让我当版主
2022-08-05 20:29
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
int& a = …… 中&是引用声明;…… = &a 中&是取地址符。一个是声明,一个是操作符
int* a = …… 中*是指针声明;…… = *a 中*是解引用符。一个是声明,一个是操作符

其它的,我没法一句话讲解完。
我建议你先了解一下 左值将亡值纯右值泛左值右值 这5个概念,
以及操作符的 结合律优先级表达式评估顺序 这3个概念。
2022-08-06 09:58
chenyucheng
Rank: 3Rank: 3
来 自:浙江省台州市临海市
等 级:论坛游侠
威 望:3
帖 子:141
专家分:181
注 册:2022-7-1
得分:0 
以下是引用rjsp在2022-8-6 09:58:52的发言:

int& a = …… 中&是引用声明;…… = &a 中&是取地址符。一个是声明,一个是操作符
int* a = …… 中*是指针声明;…… = *a 中*是解引用符。一个是声明,一个是操作符

其它的,我没法一句话讲解完。
我建议你先了解一下 左值、将亡值、纯右值、泛左值、右值 这5个概念,
以及操作符的 结合律、优先级、表达式评估顺序 这3个概念。

那为什么 int *a=123 这样的也行?
我知道左值是赋值运算符左边的值(要赋值的变量),右值是赋值运算符右边的值(赋给的值),那你说的“将亡值、纯右值、泛左值”是什么东西?
还有你说的“结合律、优先级、表达式评估顺序”,其中“结合律、表达式评估顺序”那个“菜鸟教程”没讲。

爱玩编程的小学生,有Python,但只会一点点C++。

版主->斑竹->竹子,所以版主是竹子。(doge)
//不要让我当版主
2022-08-06 22:47
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:5 
那为什么 int *a=123 这样的也行?
你用什么编译器,连这种错误代码都允许通过?你可以考虑换一个正儿八经的编译器。

我知道左值是赋值运算符左边的值(要赋值的变量),右值是赋值运算符右边的值(赋给的值)
不能望文生义。详见 https://zh.

另外
优先级和结合性:https://zh.
评估顺序:https://zh.
2022-08-07 13:04
chenyucheng
Rank: 3Rank: 3
来 自:浙江省台州市临海市
等 级:论坛游侠
威 望:3
帖 子:141
专家分:181
注 册:2022-7-1
得分:0 
回复 6楼 rjsp
谢谢。昨天已结帖。

爱玩编程的小学生,有Python,但只会一点点C++。

版主->斑竹->竹子,所以版主是竹子。(doge)
//不要让我当版主
2022-08-09 07:48



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-509723-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.073951 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved