Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指向int数组的指针给出的地址与取消引用时的地址相同_C++_Arrays_Pointers_Memory Address_Dereference - Fatal编程技术网

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);