加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:32:42 所属栏目:百科 来源:网络整理
导读:在以下代码中 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应该是访问它的正确
在以下代码中

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];

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读