C中多维数组的指针
Pointers with multi dimensional arrays in C
int array[2][3] = {{2,3,6},{4,5,8}};
printf("%d\n",*array);
这将是什么输出,请解释如何?
此致,
温斯顿
本次调用printf
printf("%d\n",*array);
调用未定义的行为,因为在指针表达式中使用了不正确的转换说明符 %d
。
如果你改写
printf("%p\n", ( void * )*array);
则输出数组占用内存区的地址,即数组第一个元素的地址。
即表达式 *array
的类型为 int'[3]
。在 printf
的调用中用作参数,它被隐式转换为指向类型 int *
的第一个元素的指针。和写
一样
printf("%p\n", ( void * )&array[0][0]);
自学多维数组。
数组array
是一个二维数组:
int array[2][3] = {{2,3,6},{4,5,8}};
*array
是数组 array
的第一个元素,因为
*array -> * (array + 0) -> array[0]
数组array
的第一个元素是array[0]
,也就是{2,3,6}
。 array[0]
的类型是 int [3]
。
当您访问数组时,它会转换为指向第一个元素的指针(此规则很少有 例外情况 )。
所以,在这个声明中
printf("%d\n",*array);
*array
将转换为类型 int *
。格式说明符 %d
需要 int
类型的参数,但您传递的是 int *
类型的参数。编译器必须为此抛出警告消息。此外,错误的格式说明符会导致未定义的行为。
如果要打印指针,请使用 %p
格式说明符。请记住,格式说明符 %p
期望参数应为指向 void
的指针,因此您应该将指针参数类型转换为 void *
.
int array[2][3] = {{2,3,6},{4,5,8}};
printf("%d\n",*array);
这将是什么输出,请解释如何?
此致,
温斯顿
本次调用printf
printf("%d\n",*array);
调用未定义的行为,因为在指针表达式中使用了不正确的转换说明符 %d
。
如果你改写
printf("%p\n", ( void * )*array);
则输出数组占用内存区的地址,即数组第一个元素的地址。
即表达式 *array
的类型为 int'[3]
。在 printf
的调用中用作参数,它被隐式转换为指向类型 int *
的第一个元素的指针。和写
printf("%p\n", ( void * )&array[0][0]);
自学多维数组。
数组array
是一个二维数组:
int array[2][3] = {{2,3,6},{4,5,8}};
*array
是数组 array
的第一个元素,因为
*array -> * (array + 0) -> array[0]
数组array
的第一个元素是array[0]
,也就是{2,3,6}
。 array[0]
的类型是 int [3]
。
当您访问数组时,它会转换为指向第一个元素的指针(此规则很少有 例外情况 )。
所以,在这个声明中
printf("%d\n",*array);
*array
将转换为类型 int *
。格式说明符 %d
需要 int
类型的参数,但您传递的是 int *
类型的参数。编译器必须为此抛出警告消息。此外,错误的格式说明符会导致未定义的行为。
如果要打印指针,请使用 %p
格式说明符。请记住,格式说明符 %p
期望参数应为指向 void
的指针,因此您应该将指针参数类型转换为 void *
.