APD*_*APD 1 c c++ arrays pointers
#include <stdio.h>
int main()
{
int arr[3][4] = {
{ 10, 11, 12, 13 },
{ 20, 21, 22, 23 },
{ 30, 31, 32, 33 }
};
printf("%u, %u", arr, *arr) // Output - 1875181168, 1875181168
}
Run Code Online (Sandbox Code Playgroud)
假设任何2D数组(arr)不是双指针,那么为什么arr&* arr引用相同的地址?
如果我们arr在纸上“绘制”阵列,它将看起来像这样
+ ----------- + ----------- + ----------- + ----------- +- ---------- + ----- + | arr [0] [0] | arr [0] [1] | arr [0] [2] | arr [0] [3] | arr [1] [0] | ... | + ----------- + ----------- + ----------- + ----------- +- ---------- + ----- +
由此可见,指向数组,数组的第一个元素以及第一个元素的第一个子元素的指针将全部相同。
即&arr == &arr[0]和&arr[0] == &arr[0][0](当然是&arr == &arr[0][0])。
这里的区别是类型:
&arr 是那种 int (*)[3][4]&arr[0] 是那种 int (*)[4]&arr[0][0]属于int *现在arr和一样*arr,您必须记住,数组自然会衰减到指向其第一个元素的指针。这意味着arr将等于&arr[0]。并且取消引用指针将是所指向的“值”,因此*arr等于*(&arr[0]),然后等于,arr[0]而该值又将衰减为&arr[0][0]。