【问题标题】:How to pass a 2D array to a function using single pointer [closed]如何使用单指针将二维数组传递给函数[关闭]
【发布时间】:2020-10-11 04:37:45
【问题描述】:

我想将二维数组传递给函数。我必须在形式参数中使用单个指针接收二维数组。

【问题讨论】:

  • 如果你有int arr[3][8];,那么你的参数就是int (*)[8]。 (指向数组的指针 int[8])

标签: c function multidimensional-array


【解决方案1】:

关于:

printf("%s ", str_arr + sizeof(char) * n * i);

稍微改写:

printf("%s ", &str_arr[n * i];

显示代码正在逐步遍历数组str_arr[][] 占用的内存,并且“输出转换”说明符%s 表示要输出字符串,从str_arr[0] 开始并将整个数组视为单个连续的一组字节。其中循环的第二次迭代访问str_arr[7],循环的第三次迭代访问str_arr[14]等。

【讨论】:

    【解决方案2】:

    在 C 中,当你有一个二维数组时,你就有一个 一维数组的数组。在访问时,数组被转换为指向其第一个元素的指针。 C11 Standard - 6.3.2.1 Other Operands - Lvalues, arrays, and function designators(p3) 对于数组数组,它是指向第一个数组 的指针。所以您的指针是type[DIM]指向数组的指针(其中DIM 是数组的维度。

    例如,如果您有一个整数数组,例如int arr[3][5];,然后在访问时你有一个 pointer-to-array int[5]。正式类型为int (*)[5]

    例子:

    #include <stdio.h>
    
    #define COLS 5
    
    /* print the contents of a 2d array */
    void prn2d (int (*a)[COLS], int rows)
    {
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < COLS; j++)
                printf (" %2d", a[i][j]);
            putchar ('\n');
        }
    }
    
    int main (void) {
        
        int arr[][COLS] = { {1, 2, 3, 4, 5},
                            {6, 7, 8, 9, 10},
                            {11, 12, 13, 14, 15} },
            n = sizeof arr/sizeof *arr;
        
        prn2d (arr, n);     /* pass arr to your function */
    }
    

    使用/输出示例

    $ ./bin/pass2darr
      1  2  3  4  5
      6  7  8  9 10
     11 12 13 14 15
    

    【讨论】:

    • 是的,这就是我们通常的做法,但 OP 说“我必须在形式参数中使用单个指针接收二维数组。”
    • int (*a)[COLS] 是一个单指针。您要么传递行数,要么使用 Sentinel 来标记数组的结尾。您可以将 Sentinel NULLpointer-to-pointer 一起使用——但这与 Array 无关。
    • "int (*a)[COLS] is a Single Pointer" -- 但是这种指针算法 (a[i][j]) 表明 a 是双指针,不是吗?
    • 这可能是 OP 所期望的,但这仍然是指针指针的语法糖。
    • 没有。 a[i][j] 只是从当前指针中删除 2 级 indirectiona[i][j] = *(*(a + i) + j),等等... 间接级别是由 array 还是 pointer 引起的,取决于类型,并不意味着 pointer-to-pointer i> 必然。 pointer-to-pointerpointer-to-array 是分开且不同的。使用 pointer-to-pointer p + 1 前进到下一个 pointer。使用 pointer-to-arrayp + 1 前进到下一个 Array
    【解决方案3】:
    #include <stdio.h>
    
    void func(char* str_arr, int m, int n)
    {
            for (int i = 0; i < m; i++) {
                    printf("%s ", str_arr + n * i);
            }
    
            printf("\n");
    }
    
    int main()
    {
            char str_arr[5][7] = {"But,", "what", "is", "the", "point?"};
    
            func((char*) str_arr, 5, 7);
    
            return 0;
    }
    

    输出

    But, what is the point?
    

    输出是我的问题(- -)

    【讨论】:

    • OT:不要在变量名中使用前导下划线,
    • @user3629249 我能知道为什么吗:( 我什至看到很多库都在使用这样的声明...
    • 编译器会在所有进入符号表的项目和生成的汇编代码中的所有标签前添加一个前导下划线,本地标签除外
    • 为什么要写你不知道它在做什么的代码?
    • 是的,这更像是那些“技术”的事情之一。二维数组是一维数组的数组,要求每个一维数组都可以通过声明边界内的下标正确访问。现在你我都知道数组在内存中保证是连续的,所以你有一个rows * cols * sizeof (type)字节的内存块。当您丢弃column 信息,然后从0 -&gt; rows * cols * sizeof (type) 为数组下标时,下标超过了第一个数组的末尾(以及所有其他数组,因为您的索引现在超出了所有一维数组的范围)。可以,但是...
    猜你喜欢
    • 1970-01-01
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 2019-03-28
    相关资源
    最近更新 更多