c-为什么数组的指针需要*


#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
int main()
{
int x[][2] = { {1,2},{3,4},{5,6},{7,8} };
int i, j;
printf("%d n", x);
for (i = 0; i <= 3; i++)
{
printf("%u %un", x + i, *(x + i));
}
for (i = 0; i <= 3; i++)
{
for (j = 0; j <= 1;j++)
printf("%u %un", *(x + i + j), *(*(x + i) + j));
}
return 0;
}

输出:

3217317712 3217317712
3217317720 3217317720
3217317728 3217317728
3217317736 3217317736
3217317712 1
3217317720 2
3217317720 3
3217317728 4
3217317728 5
3217317736 6
3217317736 7
3217317744 8

现在,当我打印(x+i)*(x+i)时,它会给我相同的结果
但是,当我打印*(x+i+j)*(*(x+i)+j)时,它会给我不同的结果
如果(x+i)*(x+i)的评估值相同,为什么在第二种情况下我会得到不同的结果?

简短回答:

表达式(x+i)*(x+i都是指针。它们有不同的类型,但在记忆中指向相同的位置。

尝试写一个更长的答案:

当您在C程序中使用数组的名称时,它(除了某些例外)会转换为指向其第一个元素的指针。因此,如果a是整数数组,则名称a将转换为指向整数的指针:

int a[3];
int *p = a; // Correct type

您的x是一个数组。当您在程序中使用名称x时,它会转换为指向其第一个元素(数组)的指针,因此您会得到指向数组的指针:

int x[][2] = { {1,2},{3,4},{5,6},{7,8} };
int (*p)[2] = x; // Correct type

那么,当您将指针取消引用运算符*添加到x时会发生什么呢?请记住,表达式x变成了一个指向数组的指针,所以当您跟随指针指向它所指向的东西时,使用*x

int *p2 = *x; // Correct type

但是这个指针p2与上面的指针p指向内存中的相同位置。只是他们的类型不同而已p指向前两个整数数组,p2则指向该数组中的第一个整数。那是同一个地方。

x+i的意思只是"将指针x向前推进i元素",而不是更改类型,所以就像表达式x-*x将指针指向内存中的同一位置一样,(x+i)

*(x+i)请注意,x是数组数组,而不是指向数组的指针数组,并且程序中的表达式x给出的是指向数组的指示器,而不是指针指向指针。如果x是一个包含指针的数组,则表达式x会为您提供一个指向指针的指针,而在情况下,x-*x

x+i*(x+i)都是指针类型,只是在第一种情况下是int**,在第二种情况下它是int*,因为它是数组上的指针,包含数组上的指示器。所以最正确的地址是*(*(x+i)+j),它会给你数字。

最新更新