类型转换(int **)和int(*)之间的区别

时间:2015-09-20 03:53:29

标签: c++

在下面的代码中,我看到了

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.

问题:

  1. 以下内容是什么意思:

    一个。 {em>含义和差异 (int**)&arr[0](int*)&arr[0]

    之间

    湾{em>含义和差异 *(int**)&arr[0]*(int*)&arr[0]

  2. 为什么*(int**)&arr[0]*(int*)&arr[0]分别以十六进制和整数形式打印地址?

1 个答案:

答案 0 :(得分:4)

整数通常打印在基数10中,而指针打印在基数16中,这解释了您观察到的输出的差异:

首先关闭:

(int**)&arr[0]是指向整数

的指针

(int*)&arr[0]是指向整数

的指针

这两个都是指针,因此它们被打印为十六进制。

然后:

*(int**)&arr[0]是一个指向整数指针的指针,解除引用一次。换句话说,它是一个指针。

*(int*)&arr[0]是指向整数的指针,解除引用一次。换句话说,它是一个整数。

最后:

*&arr[0]是一个指向整数指针的指针,解除引用一次。换句话说,它是一个指向整数的指针。

数组是一个指针数组的事实只与这种情况有关,因为在每个先前的情况下,你要做的第一件事就是抛出&arr[0]的值。