为什么int(* j)[2] = my_array会发出警告?

时间:2014-12-12 06:24:42

标签: c

以下是代码:

int my_array[] = {1, 2};
int (*j)[2] = my_array;

编译器说:"警告:从不兼容的指针类型初始化[默认启用]"

如果我用以下语句替换第二个语句,它会成功编译:

int (*j)[2] = &my_array;

我无法理解这两个陈述之间的区别,因为 my_array & my_array 会保留数组中第一个元素的地址。

3 个答案:

答案 0 :(得分:3)

永远记住C

中数组的以下规则 除了Array of type Tpointer to type T运营商之外,

&将在大多数表达式中转换为sizeof

int my_array[] = {1, 2};
int (*j)[2] = my_array;

在上面的例子中,my_array被隐式转换为pointer to int(来自int数组)。

int (*j)[2] = &my_array;

在这里,因为&运营商参与其中,它不会让my_array'将array of int转换为pointer to int并返回与LHS类型匹配的pointer to array of int

答案 1 :(得分:2)

如果你要引入一个typedef,差别很明显。

例如

typedef int T[2];

在本案例声明中

int my_array[] = {1, 2};

可以替代

T my_array = { 1, 2 };

因此,您有一个类型为T的对象,然后声明一个指向此对象的指针,您必须编写

T *j = &my_array;

对象my_array的大小等于sizeof(T),而sizeof( int[2] )又等于2 * sizeof( int ) 因此,如果要取消引用j,您将获得类型为T的对象,因此结果sizeof( *j )也等于sizeof(my_array)。

如果定义T喜欢

typedef int T;

然后在本案例中声明

int my_array[] = {1, 2};

看起来像

在本案例声明中

T my_array[] = {1, 2};

因此你有一个类型为T的对象数组,然后声明一个指向你必须编写的数组的第一个元素的指针

T *j = my_array;

my_array元素的大小等于sizeof(T)到sizeof( int )。 因此,如果要取消引用j,您将获得类型为T的对象,因此结果sizeof( *j )也等于sizeof(int)。

答案 2 :(得分:0)

my_array是 int type 的数组变量,p是 int pointer type 的数组变量。 它们不是同一个类型变量,因此编译器会抱怨。 在C中,my_arry和& my_array是编译器的不同类型,尽管它们具有相同的值。

  • my_array是数组变量,或者可以看作 int指针类型

  • & my_array被视为my_array的地址,可以将其分配给任何指针类型。