其他分享
首页 > 其他分享> > c-指向int数组的指针提供与取消引用时相同的地址

c-指向int数组的指针提供与取消引用时相同的地址

作者:互联网

我有以下代码:

#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):0x7fff5ab37c7c
j:0x7fff5ab37c7c
&j:0x7fff5ab37c70
&(*j)0x7fff5ab37c7c
*(*j):9

我认为j是指向两个整数的数组的指针.

& g是整个数组的地址.

然后j存储整个数组的地址.

因此,我使用*(j),它将取消引用数组中的第一个元素.

但是结果表明*(j)将数组地址存储为与j相同的值.

我不知道这是怎么发生的.

解决方法:

“我认为j是指向数组的指针”

是的.这也是* j输出与输出g相同的地址的原因.在这种情况下,数组会衰减到指针中,这就是为什么即使输出j也会产生相同结果的原因.

输出相同地址的事实可能使您认为j和* j是相同的指针,但实际上并非如此.它们的类型不同(实际上很重要的事实):

int g[] = {9,8};     // int[]
int (*j)[2] = &g;    // int (*)[2]

因此使用* 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);

输出9.

标签:dereference,c,arrays,pointers,memory-address
来源: https://codeday.me/bug/20191011/1896350.html