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]一样工作?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)