C++ 指向int数组的指针给出的地址与取消引用时的地址相同
我有以下代码:C++ 指向int数组的指针给出的地址与取消引用时的地址相同,c++,arrays,pointers,memory-address,dereference,C++,Arrays,Pointers,Memory Address,Dereference,我有以下代码: #include <iostream> using namespace std; int main() { int g[] = {9,8}; int (*j)[2] = &g; cout << "*(j):" << *(j) << endl; cout << "j:" << j << endl; cout << "&j:" <
#include <iostream>
using namespace std;
int main()
{
int g[] = {9,8};
int (*j)[2] = &g;
cout << "*(j):" << *(j) << endl;
cout << "j:" << j << endl;
cout << "&j:" << &j << endl;
cout << "&(*j)" << &(*j) << endl;
cout << "*(*j):" << *(*j) << endl;
return 0;
}
我认为j是指向两个整数数组的指针
和&g是整个数组的地址
然后存储整个数组的地址
所以我使用*(j),它将解引用数组中的第一个元素
但结果表明*(j)将数组地址存储为与j相同的值
我不知道这是怎么发生的
我认为j是指向两个整数数组的指针。和&g是整个数组的地址 这是正确的 所以我使用*(j),它将解引用数组中的第一个元素 这不是
*j
为您提供阵列本身。当您将其插入到cout
时,它再次衰减为指针(这次是指向其第一个元素的指针,键入int*
),并打印其值
实际上,这与您编写的cout是一样的
我认为j是指向两个整数数组的指针。
和&g是整个数组的地址
这是正确的
所以我使用*(j),它将解引用数组中的第一个元素
这不是*j
为您提供阵列本身。当您将其插入到cout
时,它再次衰减为指针(这次是指向其第一个元素的指针,键入int*
),并打印其值
实际上,这与您编写的cout“我认为j
是指向数组的指针”是一样的
是的,它是。这也是为什么*j
输出与输出g
相同的地址的原因。在这种情况下,数组衰减到指针中,这就是为什么即使输出j
也会产生相同的结果
输出相同地址的事实可能会让您认为j
和*j
是相同的指针,但它们不是。他们的类型不同(事实上很重要):
因此,使用*j
相当于直接使用g
,就像*(*j)
相当于*g
而&(*j)
不过是j
,它是用数组的地址(从衰减的g
中获取的地址,即该数组的第一个元素的地址)初始化的
那么为什么j
和*j
输出相同的地址而*(*j)
输出第一个元素的值呢
因为j
的类型是int(*)[2]
。一个简单的例子:
int g[] = {9,8};
int (*j)[2] = &g; // j points to the first element as well
cout << *((int*) j);
intg[]={9,8};
int(*j)[2]=&g;//j也指向第一个元素
cout“我认为j
是指向数组的指针”
是的,它是。这也是为什么*j
输出与输出g
相同的地址的原因。在这种情况下,数组衰减到指针中,这就是为什么即使输出j
也会产生相同的结果
输出相同地址的事实可能会让您认为j
和*j
是相同的指针,但它们不是。他们的类型不同(事实上很重要):
因此,使用*j
相当于直接使用g
,就像*(*j)
相当于*g
而&(*j)
不过是j
,它是用数组的地址(从衰减的g
中获取的地址,即该数组的第一个元素的地址)初始化的
那么为什么j
和*j
输出相同的地址而*(*j)
输出第一个元素的值呢
因为j
的类型是int(*)[2]
。一个简单的例子:
int g[] = {9,8};
int (*j)[2] = &g; // j points to the first element as well
cout << *((int*) j);
intg[]={9,8};
int(*j)[2]=&g;//j也指向第一个元素
cout*j
是数组本身。*j
是数组本身。
int g[] = {9,8};
int (*j)[2] = &g; // j points to the first element as well
cout << *((int*) j);