【问题标题】:What is the difference between ptr = my_array and ptr = &my_array[0][0] in C language?C语言中的ptr = my_array和ptr = &my_array[0][0]有什么区别?
【发布时间】:2017-11-05 08:57:31
【问题描述】:

我是 C 的新手。对于以下代码:

int *ptr;
int my_array[5][5] = {{1,2},{3,4,5},{6},{7}};

我注意到我的编译器产生了一个警告:

ptr = my_array;

但工作正常:

ptr = &my_array[0][0];

这是为什么呢?

【问题讨论】:

    标签: c pointers multidimensional-array reference dereference


    【解决方案1】:

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

    如果你有这样的数组

    int my_array[5][5];
    

    那么它是一个数组数组,数组元素的类型为int[5]。例如,表达式my_array[0] 的类型为int[5]。因此,表达式中使用的数组被转换为类型为int ( * )[5] 的指针,该指针指向它的第一个元素(指向它的第一个“行”)。

    类型 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多