关于指针的一个简短的c++程序

A short C++ program about the pointer

本文关键字:c++ 程序 一个 指针 于指针      更新时间:2023-10-16
#include <iostream>
using namespace std;
    int main()
    {
        int x[][3]={1,2,3,4,5};
        cout<<&x   <<" "<<*x   <<" "<<x   <<endl;
        cout<<&x[0]<<" "<<*x[0]<<" "<<x[0]<<endl;
        cout<<&x[0][0]<<endl;
        return 0;
    }

结果是:

0x28fef8 0x28fef8 0x28fef8
0x28fef8 1        0x28fef8
0x28fef8

为什么x[0][0]和x在同一个指针?什么是真正在0x28fef8?1还是0x28fef8?

像你这样的数组的数组在内存中是这样的

<>之前+---------+---------+---------+---------+---------+---------+| x [0] [0] | x [0] [1] | x [0] [2] | x [1] [0] | x [1] [1] | x [1] [2] |+---------+---------+---------+---------+---------+---------+之前

xx[0]x[0][0]的位置相同。

同样,数组自然会衰变成指向其第一个元素的指针。如果您使用普通的x,您将得到&x[0]。如果你使用x[0],你会得到&x[0][0]。因此,当您执行*x[0]时,它与执行*&x[0][0]时相同,并且解引用操作符和地址操作符相互抵消,因此您只剩下x[0][0],这是您要打印的值。

此外,为了帮助您理解为什么x&x[0]相同,您需要知道对于任何数组或指针 x和索引i,表达式x[i]*(x + i)相同。这意味着表达式&x[i]&*(x + i)相同,并且由于寻址操作符和解引用操作符再次相互抵消,&x[i](x + i)相同(或者没有括号x + i)。现在考虑i为零的情况,那么我们有&x[0],它和x + 0一样,和x一样。所以&x[0]x是一样的,反之亦然。


对于其他想知道&x&x[0]&x[0][0]代表什么的人,请参阅:

<>之前+---------+---------+---------+---------+---------+---------+| x [0] [0] | x [0] [1] | x [0] [2] | x [1] [0] | x [1] [1] | x [1] [2] |+---------+---------+---------+---------+---------+---------+^ ^ ^ ^| | | |+ - x + - x [0] [1 ] +- & x + 1 + - x [1] [1]| |+- &x[0] +- &x[1]| |+- &x[0][0] +- &x[1][0]之前

虽然所有的x, x[0], &x, &x[0]&x[0][0]可以表示相同的内存地址,但它们在语义上是不同的,即它们表示不同的类型:

  • x是指向三个char(或char (*)[3])数组的指针
  • x[0]指向char(或char *)
  • &x是指向包含三个char(或char (*)[3][3])的数组的指针。
  • &x[0]是指向三个char(或char (*)[3])数组的指针。
  • &x[0][0]指向char(或char *)

当数组名满足sizeof()时返回数组的大小,当数组名满足&时返回指向该数组的指针,而不是数组名的地址。