C 指针:给定上下文中*和(int*)之间的差异

C 指针:给定上下文中*和(int*)之间的差异,c,pointers,C,Pointers,语句1不编译。 语句2和语句3编译。 现在,考虑到数组是整数类型,我无法理解如果我将(int*)替换为*,会有什么区别。您对解引用操作符*和强制转换操作(int*)感到困惑,您的第一行应该有一个提示: int ar[3][3]={{1,2,3},{4,5,6},{7,8,9}}; statment1: int k=(int *)((int *)(ar+1)+2); statment2: int l=*(*(ar+1)+2); statement3 int *p = (int *)a +1

语句1不编译。 语句2和语句3编译。
现在,考虑到数组是整数类型,我无法理解如果我将
(int*)
替换为
*
,会有什么区别。

您对解引用操作符
*
和强制转换操作
(int*)
感到困惑,您的第一行应该有一个提示:

int ar[3][3]={{1,2,3},{4,5,6},{7,8,9}};

statment1:  int k=(int *)((int *)(ar+1)+2);
statment2:  int l=*(*(ar+1)+2);
statement3  int *p = (int *)a +1;
您试图影响
int
变量中的地址(指向
int
的指针)

第二个是可以的,因为您使用
*
两次来获取二维数组中的值。 第三个也可以,因为您的容器
int*p
具有获取地址的正确类型(并且您只取消引用“一维”)


我希望它足够清楚,无论如何,您可以看看这篇关于取消引用运算符的文章。

在这一行中,使用指针而不是数组索引时会出现混淆:

int k = (int *)bar;
它的意思似乎是
ar[1][2]
,但是,这不是它们所具有的含义。为了创建
ar[1][2]
索引的等效指针表示形式,应该是:

statment1:  int k=(int *)((int *)(ar+1)+2);

*
是获取指针指向的对象的值,
(int*)
是转换为整数的指针。也许最好不要编译任何东西……尝试实际阅读并理解指针的实际含义,然后(通过阅读、尝试和学习)找出它指针运算需要什么。不要期望这里有一节指针基础的1对1课
statment1:  int k = *(*(ar + 1) + 2) // equivalent to k = ar[1][2]