取消引用变量地址是否与取消引用包含该地址的指针类型的变量相同?

Is dereferencing a variable address the same as dereferencing a variable of type pointer that contains that address?

提问人:alessio solari 提问时间:7/29/2023 更新时间:7/29/2023 访问量:53

问:

请考虑以下代码:

int main(){
   
   
   int a = 10;
   int* p = &a;

   //case 1

   *(&a);
   *p;

   //case 2

   *((&a) + 1);
   *( p + 1 );
   
   
}

  1. 这两种形式是一样的吗?

  2. 断言指针只是一个“可以”存储在变量中以供以后使用的地址是否正确?

  3. 不使用指针变量取消引用地址时是否有一些注意事项?

C 指针内存 地址

评论

0赞 Fe2O3 7/29/2023
#2...稍微转过来:“指针是用于存储内存地址以供以后使用的变量。
0赞 alessio solari 7/29/2023
Fe203,“如果 v 是 T 类型的变量,则 &v 是 T * 类型的 pionter”。这是我在问这个问题时收到的评论之一:stackoverflow.com/q/76782387/14595895
0赞 alessio solari 7/29/2023
Fe203,所以事实证明,如果我有 int a = 10;&a 确实是一个指针。这意味着,即使他们说指针是包含地址的变量,在更大的意义上,对象的地址也是引用特定类型的指针
0赞 Fe2O3 7/29/2023
变量(“指针”)的值可以更改(重新赋值)。变量的“地址”不能...你可以自由地思考你想要什么......

答:

0赞 Nicholas 7/29/2023 #1

是的,而且是完全一样的。该变量仅包含 的内存地址。*p*(&a)pa

2. 指针只是一个变量,其中包含一个被解释为内存地址的数字,最常见的是 a 表示 32 位系统,a 表示 64 位系统。uint32_tuint64_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);取消引用 的地址,从而生成存储在 中的值。aa

*p;取消引用存储的值,其中的地址也导致存储在 中的值。paa

所以两者的效果是一样的。

同样,在案例 2 中:

*((&a) + 1);
*( p + 1 );

这两个语句具有相同的效果,但在这里要小心,它被声明为类型的变量,而不是数组。因此,这两个语句都存在语义错误,并导致未定义的行为。aint

评论

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 - 是一个“变量”,因为它的值可以变化。例如,如果你这样做,它就不再是“只是一个的地址”。pp = &b;