Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中,ptr=my_数组和ptr=&my_数组[0][0]之间有什么区别?_C_Pointers_Multidimensional Array_Reference_Dereference - Fatal编程技术网

在C语言中,ptr=my_数组和ptr=&my_数组[0][0]之间有什么区别?

在C语言中,ptr=my_数组和ptr=&my_数组[0][0]之间有什么区别?,c,pointers,multidimensional-array,reference,dereference,C,Pointers,Multidimensional Array,Reference,Dereference,我是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

我是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_数组[0]的类型为int[5]。因此,表达式中使用的数组被转换为int*[5]类型的指针,该指针指向其第一行的第一个元素

类型int*和int*[5]是不同的类型,不存在从一种类型到另一种类型的隐式转换

表达式&my_数组[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');
    }
}

表达式中使用的数组(很少有例外)被转换为指向其第一个元素的指针

如果你有这样一个数组

int my_array[5][5];
然后是一个数组数组,数组的元素类型为int[5]。例如,表达式my_数组[0]的类型为int[5]。因此,表达式中使用的数组被转换为int*[5]类型的指针,该指针指向其第一行的第一个元素

类型int*和int*[5]是不同的类型,不存在从一种类型到另一种类型的隐式转换

表达式&my_数组[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');
    }
}