【发布时间】:2018-08-28 16:40:17
【问题描述】:
我正在研究如何在指针的帮助下显示二维数组的元素。这是我尝试过的代码:
#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)) -
arr[2]和*(arr + 2)在语言 (C11 §6.5.2.1 Array subscripting ¶2) 中的定义相同。你会得到奇怪的结果,因为你打印的是地址,而不是数组中单元格的值。这是官方未定义的行为;您将地址传递给printf(),但告诉它它有一个无符号整数可以处理。在 32 位平台上,您可能或多或少都可以。结果在 64 位平台上并不可靠。 -
从技术上讲,您得到的是 UB,因为
%u不用于打印指针。 You have to use%zu -
@phuclv:你说得对,
%u是 UB,但使用%zu也是如此(用于打印size_t)。您应该使用%p并将指针转换为void *,或使用<inttypes.h>和PRIuPTR(或PRIXPTR用于大写十六进制)加上转换为uintptr_t。 -
@phuclv:错误。
%zu需要size_t参数。任何不兼容的类型都会触发未定义的行为。指针参数将触发未定义的行为。