以下是代码:
int my_array[] = {1, 2};
int (*j)[2] = my_array;
编译器说:"警告:从不兼容的指针类型初始化[默认启用]"
如果我用以下语句替换第二个语句,它会成功编译:
int (*j)[2] = &my_array;
我无法理解这两个陈述之间的区别,因为 my_array 和& my_array 会保留数组中第一个元素的地址。
答案 0 :(得分:3)
永远记住C
中数组的以下规则 除了Array of type T
和pointer 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的地址,可以将其分配给任何指针类型。