我正在学习如何使用指针显示二维数组的元素。以下是我尝试的代码:
#include<stdio.h>
int main(){
int arr[3][2] = {
{7, 8},
{6,3},
{3,4}
};
printf("%u\n", (arr + 2));
printf("%u\n", *(arr + 2));
}
输出:
6487616
6487616
我希望 *(arr + 2)
的输出结果是 3
。这和 (arr + 2)
有什么关系呢?
*(*(arr+2))
。 - Govind Parmararr[2]
和*(arr+2)
的定义是相同的(参见C11§6.5.2.1数组下标运算符第2段)。由于您打印的是一个地址而不是数组元素的值,因此会产生奇怪的结果。这是正式未定义的行为;您向printf()
传递了一个地址,但告诉它要处理一个无符号整数。在32位平台上可能还好,但在64位平台上结果就完全不可靠了。 - Jonathan Leffler%u
是未定义行为,但是使用%zu
也是(用于打印size_t
)。你应该使用%p
并将指针转换为void *
,或者使用<inttypes.h>
中的PRIuPTR
(或PRIXPTR
用于大写十六进制)加上一个uintptr_t
类型的转换。 - Jonathan Leffler%zu
需要一个size_t
参数。任何不兼容的类型都会触发未定义行为。指针参数也会触发未定义行为。 - AnT stands with Russia