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