C 指针:给定上下文中*和(int*)之间的差异
语句1不编译。 语句2和语句3编译。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
现在,考虑到数组是整数类型,我无法理解如果我将
(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]