在C中,为什么(int *)&x [k]和2-D数组x的(int *)x [k]一样工
在以下代码中
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 %in",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]; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- x210ii开发板使用fastboot下载出现没有权限的问题
- 如何在窗体之间通讯的几种方法 ? VB.NET方案 .
- PostgreSQL组合没有重复
- 为OBIEE(Oracle Business Inteligence)添加jasig CAS身份验
- React事件方法、React定义方法的几种方式、获取数据、改变数
- Oracle中检查是否需要重构索引的sql
- 正则表达式30分钟入门教程
- hdu 6140 Hybrid Crystals 阅读题 OR bitset 优化01背包
- Error occured processing XML 'Cannot find class [sp
- 更改underlineColorAndroid on Focus for TextInput in rea