c - 二维和一维数组中指针的区别

标签 c arrays pointers

我今天练习了一些 C 代码,尤其是带有返回函数和指针的数组。 我发现了一些非常令人困惑的代码,我想知道为什么会这样。

所以我首先有一个函数可以打印出数组中的所有元素。

void function(int *arr)
{
    ...
    printf("%d, arr[i]);
}

现在在 main 中我有一个二维数组和一个一维数组。

int array2D[2][2] = {{1,2}, {3,4}};
int array1D[3] = {1,2,3};

function(*array2D); // Why do I need here the derefernce pointer
function(array1D);  // why I don't need here the deference pointer

在另一种情况下:

void disp( int *num)
{
    printf("%d ", *num);
}

int main()
{
    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
    for (int i=0; i<10; i++)
    {
        /* Passing addresses of array elements*/
        disp(&arr[i]); // why i need here & and above in the function not
    }
}

这让我现在很困惑。谁能给我解释一下?

最佳答案

第一行

function(*array2D);

相当于

function(array2D[0]);

所以你传递的是第一个数组[1,2]。在 C 中,数组衰减为指针 当它被传递给一个函数时。

然而,您的函数函数1也应该得到 数组的元素。

void function(int *arr, size_t len)
{
    size_t i;
    for(i = 0; i < len; ++i)
        printf("%d\n", arr[i]);
}

然后你可以调用它2

int array2D[2][2] = { { 1,2} ,{3,4}};
int array1D[3] = {1,2,3};

function(*array2D, sizeof *array2D / sizeof **array2D);
function(array1D, sizeof array1D / sizeof *array1D);

  disp (&arr[i]); // why i need here & and above in the function not

因为 arr[i] 会给你存储在 i 位置的值,disp 需要一个指针,因此您使用 & 运算符返回 i位置的数组,也等价于arr + i


1不要调用你的函数function。从技术上讲,这是有效的名称,但它 如果你给你的函数更明确的名字会更好,这样就可以了 看名字就知道功能是什么。

2请注意,sizeof array/sizeof *array 仅适用于数组。如果你有一个 函数并且你期望一个数组,你只会得到一个指向数组的指针。 在这种情况下,您还需要传递数组的长度。

关于c - 二维和一维数组中指针的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48290730/

相关文章:

c - 给定 `int num[7]` , `num` 、 `&num[0]` 、 `&num` 有何不同?

c - 接收rtp包并写入二进制文件

无法在 C 中实现带有二维数组的结构

c - 使用 dup2 将 stdout/stderr 重定向到同一个文件时出现问题

c++ - 如何操作字符数组

php - fatal error : Cannot use string offset as an array?

python - 在 Hy 中使用 numpy.nditer

c - 从函数分配一个 void 指针在一个源文件中有效,但在两个文件中无效

c++ - gcc 相对于在新表达式中解析 type-id 发出错误

c - 排序和打印数组元素打印出垃圾