我有以下代码:
#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
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句