C++ 类型转换(int**)和int(*)之间的差异

C++ 类型转换(int**)和int(*)之间的差异,c++,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

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

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.
问题:

以下是什么意思:

a。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]的值

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

首先:

int**&arr[0]是指向整数的指针

int*&arr[0]是指向整数的指针

这两个都是指针,所以它们以十六进制打印

然后:

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

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

最后:

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


数组是指针数组这一事实只与本例有关,因为在前面的每种情况下,您首先要做的是强制转换&arr[0]的值

施法不会改变值;它只是改变了编译时类型。int*出现在标题中,但在问题中没有出现。@Slaks:这通常是错误的,或者可以用更好的措辞,这取决于你的意思。e、 g.在某种程度上,双精度和int可以被认为具有相同的值,int3.5肯定与3.5不相同。铸造不会改变值;它只是改变了编译时类型。int*出现在标题中,但在问题中没有出现。@Slaks:这通常是错误的,或者可以用更好的措辞,这取决于你的意思。e、 g.在某种程度上,双精度和整数可以被认为具有相同的值,int3.5肯定与3.5不一样。不客气!如果您喜欢这个答案,请接受它,以便将来的访问者知道它解决了您的问题。我想指出,&arr[0]的类型是int**。这意味着任何非int**的&arr[0]的强制转换都会产生无效的结果,因为指向指针数组的指针实际上无法被合理地重新解释为其他任何内容。强制转换int*&arr[0]为您提供int**的地址,但结果不能这样使用。也就是说,*int*&arr[0]不返回有效的整数值,但**int**&arr[0]返回有效的整数值,即i@Alex:这5个示例都是c样式转换,对吗?如果我做C++风格类型的转换,这5个例子的语法会是什么?一个int风格的int型和ARR(0)的例子对应于StasyStudio和ARR(0),欢迎您!如果您喜欢这个答案,请接受它,以便将来的访问者知道它解决了您的问题。我想指出,&arr[0]的类型是int**。这意味着任何非int**的&arr[0]的强制转换都会产生无效的结果,因为指向指针数组的指针实际上无法被合理地重新解释为其他任何内容。强制转换int*&arr[0]为您提供int**的地址,但结果不能这样使用。也就是说,*int*&arr[0]不返回有效的整数值,但**int**&arr[0]返回有效的整数值,即i@Alex:这5个示例都是c样式转换,对吗?如果我做C++风格类型的转换,这5个例子的语法是什么?一个int型的int型和ARR(0)的例子对应于STATICE-STASTRAGE和ARR(0)。