【发布时间】:2020-09-14 14:42:26
【问题描述】:
#include <stdio.h>
int main()
{
int s[5][3] = { {1,2,6}, {7,3,4}, {8,5,6}, {2555,7,8}, {766,9,0} };
printf("%u %u %u %u %u\n", (s+0), *(s+1), *(s+2), *(s+3), *(s+4));
return 0;
}
C 语言代码。
在 printf 语句中,当我使用 (s+0) 时,它会在上面的代码中打印地址。所以如果我使用 * 运算符
即 *(s+1) 它应该在地址 (s+1) 处给我价值。但它仍然给了我一个地址。
所以我的问题是:
- 为什么 * 不在地址上赋值?
- (s+0) 是否与 *(s+0) 相同?
ps. 对于一维数组 int s[] = {1,2,3}; s 给出第零个元素的值,*(s+i) 给出数组 s 的第 i 个元素的值。
【问题讨论】:
-
s[0][0]从地址 0xffff089 开始(无论如何)。s+0为您提供数组第一个元素的指针。*(s+0)为您提供指向 [][] 数组的第一个元素的指针,它仍然是指向值1 -
所有这些表达式都是地址。
s是二维数组,所以即使解引用也会给你一个地址。 -
提示:启用编译器警告。使用 gcc 添加
-Wall -Wextra -Wpedantic以查看所有内容。你可以通过这个来了解更多 -
*(s+4)与s[4]相同,*(*(s+4)+3)与s[4][3]相同。 -
使用
%u格式说明符打印地址会导致未定义的行为。使用%p并将值转换为void*。