在下面的代码中,我看到
int i=2;int j=3;
int* arr[]={&i,&j};
cout<<*&arr[0]<<endl; //its arr[0] i.e. &i
cout<<(int*)&arr[0]<<endl; //address of 1st element of arr.
cout<<(int**)&arr[0]<<endl; // same as above even though now typecasted to int**
cout<<*(int**)&arr[0]<<endl; // this prints the address of arr[0] in hex
cout<<*(int*)&arr[0]<<endl; //this prints the address of arr[0] in int.
问题:
下面是什么意思:
。含义和
(int**)&arr[0]
与(int*)&arr[0]
的差异b。含义和
*(int**)&arr[0]
与*(int*)&arr[0]
的差异为什么
*(int**)&arr[0]
和*(int*)&arr[0]
分别以十六进制和整型打印地址?
整数通常以10为基数打印,而指针以16为基数打印,这解释了您所观察到的输出差异:
首先:
(int**)&arr[0]
是指向整型指针的指针
(int*)&arr[0]
是一个指向整数的指针
这两个都是指针,所以它们被打印为十六进制。
:
*(int**)&arr[0]
是一个指向整型指针的指针,解引用一次。换句话说,它是一个指针。
*(int*)&arr[0]
是一个指向整型的指针,解引用一次。换句话说,它是一个整数。
最后:
*&arr[0]
是一个指向整型指针的指针,解引用一次。也就是说,它是一个指向整数的指针。
数组是指针数组的事实只与这种情况有关,因为在前面的每种情况中,您要做的第一件事是强制转换&arr[0]
的值。