在C中,为什么(int *)&x [k]和2-D数组x的(int *)x [k]一样工作?

在C中,为什么(int *)&x [k]和2-D数组x的(int *)x [k]一样工作?,第1张

概述在以下代码中 int x[2][3] = {{1,2,3},{4,5,6}}; int* y1 = (int*)x[1]; int* y2 = (int*)&x[1]; int i; for(i=0; i < 3 ; i++) { printf("%i %i\n",y1[i],y2[i]);} 为什么y1和y2指向相同的数据? 我认为x [1]是指向第二行数据的指针,因此y1应该 在以下代码中

int x[2][3] = {{1,2,3},{4,5,6}}; int* y1 = (int*)x[1]; int* y2 = (int*)&x[1]; int i; for(i=0; i < 3 ; i++) {  printf("%i %i\n",y1[i],y2[i]);}

为什么y1和y2指向相同的数据?

我认为x [1]是指向第二行数据的指针,因此y1应该是访问它的正确方法.表达式& x [1]得到指向第二行数据的指针的地址,为什么y2甚至可以工作

解决方法 鉴于声明

int x[2][3] = {{1,6}};

表达式x [1]的类型是“int的3元素数组”.除非数组表达式是sizeof或&的 *** 作数. address-of运算符,或者是用于初始化声明中的另一个数组的字符串文字,表达式的类型转换为“指向T的指针”,表达式的值是数组的第一个元素的地址.

因此,在声明中

int *y1 = (int *) x[1];

演员是不必要的; x [1]将自动转换为int *类型,y1将指向x [1] [0].

在宣言中

int *y2 = (int *) &x[1];

数组表达式x [1]是&的地址的 *** 作数.运算符,因此它不会自动转换为int *类型.表达式& x [1]的类型是“指向int的3元素数组的指针”或int(*)[3].在这种情况下,强制转换是必要的,因为你不能隐式地将指向T数组的指针转换为指向T的指针.但是,它可能不是你想要做的;将指向数组的指针转换为指向标量的指针可能会导致某人混淆.

请注意,x [1]和& x [1]产生相同的值(数组中第一个元素的地址与数组本身的地址相同),但类型不同,这对事物很重要喜欢和 – *** 作符.

如果你想避免强制转换,请将这些声明重写为

int *y1      =  x[1];int (*y2)[3] = &x[1];
总结

以上是内存溢出为你收集整理的在C中,为什么(int *)&x [k]和2-D数组x的(int *)x [k]一样工作?全部内容,希望文章能够帮你解决在C中,为什么(int *)&x [k]和2-D数组x的(int *)x [k]一样工作?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1213478.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存