C++ C+中指针的地址+;

C++ C+中指针的地址+;,c++,pointers,C++,Pointers,我试图理解指针,但我一件事也做不到。 比如说, //part of code int *p; int tab[3]; 现在我们有了变量tab,它包含数组第一个元素的地址。我想创建一个指向该指针的指针。 所以,我会这样做: p=&tab; 如果它可以工作,p将是tab的地址(这意味着它将指向tab) 不幸的是,它不起作用。那个么,如何获得指针本身的地址呢? 地址的正确类型是什么?(addresstype*p)我想要指向包含选项卡第一个元素地址的内存块,而不是选项卡本身 记住数组衰减为

我试图理解指针,但我一件事也做不到。 比如说,

//part of code

int *p;
int tab[3];
现在我们有了变量
tab
,它包含数组第一个元素的地址。我想创建一个指向该指针的指针。 所以,我会这样做:

p=&tab;
如果它可以工作,
p
将是
tab
的地址(这意味着它将指向
tab
) 不幸的是,它不起作用。那个么,如何获得指针本身的地址呢?
地址的正确类型是什么?(addresstype
*p
)我想要指向包含
选项卡
第一个元素地址的内存块,而不是
选项卡
本身

记住数组衰减为指向第一个元素的指针。因此,无论何时需要指向数组的指针,只要按原样使用数组即可。像

p = tab;
所以现在我们使用变量选项卡,它包含数组第一个元素的地址

不,我们有一个变量
选项卡
,它是一个数组

我想创建一个指向这个指针的指针

如果您想要一个指向数组第一个元素的指针,那么这很容易:数组可以隐式地转换为该指针(这导致人们普遍认为数组是指针,但这是错误的)

如果您想要指向数组的指针,而不是第一个元素,那么这是另一种类型:

int (*p)[3] = &tab;
但你通常不会想要这样的东西

那个么,如何获得指针本身的地址呢

没有指针,因此无法获取该地址。如果你有一个指针,那么你可以像其他任何对象一样获取它的地址:

int * p = arr;   // Pointer to first element of array
int ** pp = &p;  // Pointer to pointer
我想指出的是包含tab的第一个元素的地址的内存块,而不是tab本身

这毫无意义<代码>选项卡是包含其元素的内存块。

试试这个

int *p;
int tab[3];
p = &tab[0];

测试这段代码,您将看到p如何直接指向数组的第一个位置,因此您也可以从p访问其值

int *p;
int tab[3];

tab[0] = 56;
tab[1] = 57;
tab[2] = 58;

p = tab;

cout << p[0] <<endl;
cout << p[1] <<endl;
cout << p[2] <<endl;
int*p;
int tab[3];
表[0]=56;
表[1]=57;
表[2]=58;
p=制表符;

对于
int(*p)[3]=tab,cout+1
,是否存在这样的声明有用的情况?@Paranaix:它可以用作函数参数,因此只能传递大小正确的数组(或者将大小推断为模板参数)。但是,当我学习C++时,它被告知Tab不是数组,而是一个指针(在一个又一个内存块上)。@ USS3402584,那么你很不幸地被告知错误。这是一种常见的误解。数组很乐意转换为指针,但它们不是一回事。@user3402584:数组可以转换为指针,如答案中所述。因此
tab+1
将其转换为指针,然后添加一个指针以获取
tab[1]
的地址。但是,尽管允许此转换,数组本身不是指针。请对此进行读取:
int *p;
int tab[3];

tab[0] = 56;
tab[1] = 57;
tab[2] = 58;

p = tab;

cout << p[0] <<endl;
cout << p[1] <<endl;
cout << p[2] <<endl;