提问人:alessio solari 提问时间:7/29/2023 更新时间:7/29/2023 访问量:53
取消引用变量地址是否与取消引用包含该地址的指针类型的变量相同?
Is dereferencing a variable address the same as dereferencing a variable of type pointer that contains that address?
问:
请考虑以下代码:
int main(){
int a = 10;
int* p = &a;
//case 1
*(&a);
*p;
//case 2
*((&a) + 1);
*( p + 1 );
}
这两种形式是一样的吗?
断言指针只是一个“可以”存储在变量中以供以后使用的地址是否正确?
不使用指针变量取消引用地址时是否有一些注意事项?
答:
0赞
Nicholas
7/29/2023
#1
是的,而且是完全一样的。该变量仅包含 的内存地址。*p
*(&a)
p
a
2.
指针只是一个变量,其中包含一个被解释为内存地址的数字,最常见的是 a 表示 32 位系统,a 表示 64 位系统。uint32_t
uint64_t
3. 据我所知,没有。两者只是相同的内存地址。
评论
0赞
alessio solari
7/29/2023
尼古拉斯,但为什么人们一直说指针是一个变量?更正确的说法是,指针只是一个引用某种类型的地址,并且“可以存储”在包含指针的特殊类型的变量中。?
0赞
stark
7/29/2023
您可以更改指针中的值,因此它是一个变量。p++
0赞
Fe2O3
7/29/2023
此外,“指针算术”将变量(即指针)的值更改为所指向的数据类型的适当字节数。
0赞
Nicholas
7/29/2023
@alessiosolari 指针是一个变量,该变量中是一个内存地址。当我们取消引用指针时,编译器会查看该内存地址并给出在那里找到的值。指针的类型只是告诉编译器如何解释内存地址处的二进制数据。
0赞
machine_1
7/29/2023
#2
在案例 1 中:
*(&a);
取消引用 的地址,从而生成存储在 中的值。a
a
*p;
取消引用存储的值,其中的地址也导致存储在 中的值。p
a
a
所以两者的效果是一样的。
同样,在案例 2 中:
*((&a) + 1);
*( p + 1 );
这两个语句具有相同的效果,但在这里要小心,它被声明为类型的变量,而不是数组。因此,这两个语句都存在语义错误,并导致未定义的行为。a
int
评论
0赞
alessio solari
7/29/2023
machine_1,但为什么人们一直说指针是变量?说指针只是一个引用某种类型的地址,并且“可以存储”在包含指针的特殊变量中,是否应该更正确?
0赞
alessio solari
7/29/2023
我的意思是指针本身只是某种类型的地址......
0赞
machine_1
7/29/2023
指针是一种特殊类型的变量,用于存储另一个对象的地址。
0赞
alessio solari
7/29/2023
machine_1,我听过很多人说指针只是一个地址。如果正如您所说,它是一个变量,那么为什么我们在取消引用原始地址时会得到相同的结果?
0赞
BoP
7/29/2023
@alessiosolari - 是一个“变量”,因为它的值可以变化。例如,如果你这样做,它就不再是“只是一个的地址”。p
p = &b;
评论