C语言中ptr = my_array和ptr = &my_array[0][0]有什么区别?
What is the difference between ptr = my_array and ptr = &my_array[0][0] in C language?
我是C新手,对于下面的代码:
int *ptr;
int my_array[5][5] = {{1,2},{3,4,5},{6},{7}};
我注意到我的编译器针对以下内容发出警告:
ptr = my_array;
但适用于:
ptr = &my_array[0][0];
这是为什么?
在极少数情况下,表达式中使用的数组被转换为指向其第一个元素的指针。
如果你有这样的数组
int my_array[5][5];
那么它是一个数组的数组,数组的元素具有类型int[5]
。例如,表达式 my_array[0]
的类型为 int[5]
。因此表达式中使用的数组被转换为 int ( * )[5]
类型的指针,指向它的第一个元素(指向它的第一个 "row")。
类型 int *
和 int ( * )[5]
是不同的类型,没有从一种类型到另一种类型的隐式转换。
表达式 &my_array[0][0]
的类型为 int *
。
所以如果你想将数组重新解释为一维数组你需要使用隐式转换
ptr = ( int * )my_array;
调查这个演示程序
#include <stdio.h>
int main( void )
{
int my_array[5][5] =
{
{ 1, 2 },
{ 3, 4, 5 },
{ 6 },
{ 7 }
};
for (int(*p)[5] = my_array; p != my_array + 5; ++p)
{
for (int *q = *p; q != *p + 5; ++q)
{
printf("%d ", *q);
}
putchar('\n');
}
}
它的输出是
1 2 0 0 0
3 4 5 0 0
6 0 0 0 0
7 0 0 0 0
0 0 0 0 0
我是C新手,对于下面的代码:
int *ptr;
int my_array[5][5] = {{1,2},{3,4,5},{6},{7}};
我注意到我的编译器针对以下内容发出警告:
ptr = my_array;
但适用于:
ptr = &my_array[0][0];
这是为什么?
在极少数情况下,表达式中使用的数组被转换为指向其第一个元素的指针。
如果你有这样的数组
int my_array[5][5];
那么它是一个数组的数组,数组的元素具有类型int[5]
。例如,表达式 my_array[0]
的类型为 int[5]
。因此表达式中使用的数组被转换为 int ( * )[5]
类型的指针,指向它的第一个元素(指向它的第一个 "row")。
类型 int *
和 int ( * )[5]
是不同的类型,没有从一种类型到另一种类型的隐式转换。
表达式 &my_array[0][0]
的类型为 int *
。
所以如果你想将数组重新解释为一维数组你需要使用隐式转换
ptr = ( int * )my_array;
调查这个演示程序
#include <stdio.h>
int main( void )
{
int my_array[5][5] =
{
{ 1, 2 },
{ 3, 4, 5 },
{ 6 },
{ 7 }
};
for (int(*p)[5] = my_array; p != my_array + 5; ++p)
{
for (int *q = *p; q != *p + 5; ++q)
{
printf("%d ", *q);
}
putchar('\n');
}
}
它的输出是
1 2 0 0 0
3 4 5 0 0
6 0 0 0 0
7 0 0 0 0
0 0 0 0 0