在c中更改int数组中的值

时间:2018-02-21 23:29:40

标签: c arrays pointers multidimensional-array

我正在尝试理解数组中的值/指针管理。

想象一个包含5个元素的数组,并从main之外的函数中改变它们。我必须使用指针。我已经制作了这个简单的程序来尝试执行它:

#include <stdio.h>

void Mudar (int **cartao2)
{
    *cartao2[0] = 5;
    *cartao2[1] = 4;
    *cartao2[2] = 3;
    *cartao2[3] = 2;
    *cartao2[4] = 1;
}

int main()
{
    int cartao[] = {1,2,3,4,5};

    printf("int cartao[] = {");
    for (int i = 0; i < 4; i++)
        printf("%d,", cartao[i]);
    printf("%d};\n",cartao[4]);

    Mudar(&cartao);

    printf("int cartao[] = {");
    for (int i = 0; i < 4; i++)
        printf("%d,", cartao[i]);
    printf("%d};\n",cartao[4]);

}

该程序在执行时会出错,但仅在尝试执行第5行时出错。它甚至打印

int cartao[] = {1,2,3,4,5};

这里有什么问题。

下一步是尝试更改数组数组中的值。有任何提示可以实现吗?

修改

正如@Stephen Docy指出这个代码现在有效

#include <stdio.h>

void Mudar (int *cartao2)
{
    cartao2[0] = 5;
    cartao2[1] = 4;
    cartao2[2] = 3;
    cartao2[3] = 2;
    cartao2[4] = 1;
}

int main()
{
    int cartao[] = {1,2,3,4,5};

    printf("int cartao[] = {");
    for (int i = 0; i < 4; i++)
        printf("%d,", cartao[i]);
    printf("%d};\n",cartao[4]);

    Mudar(cartao);

    printf("int cartao[] = {");
    for (int i = 0; i < 4; i++)
        printf("%d,", cartao[i]);
    printf("%d};\n",cartao[4]);

}

输出

int cartao[] = {1,2,3,4,5}; int cartao[] = {5,4,3,2,1};

但是现在我很好奇这个工作应该是这样吗?

#include <stdio.h>

void Mudar (int *cartao2)
{
    int aux = 25;
    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            cartao2[i][j] = aux;
            aux--;
        }
    }
}

int main()
{
    int cartao[5][5];
    int aux = 1;

    //populates cartao from 1 to 25
    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            cartao[i][j] = aux;
            aux++;
        }
    }

    //prints before changing
    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            printf("%2d ", cartao[i][j]);
        }
        printf("\n");
    }

    Mudar(cartao);

    //prints after changing
    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            printf("%2d ", cartao[i][j]);
        }
        printf("\n");
    }

}

因为该程序甚至无法编译:

testes7.c:10: error: pointer expected

但它的使用方式与现在运行良好的代码相同。

3 个答案:

答案 0 :(得分:3)

Stephen Docy为您提供了如何将数组传递给函数的解决方案。 ID 喜欢评论你做的方式以及它失败的原因。

int cartao[] = {1,2,3,4,5};

这会创建一个int[5]数组。 &array的类型为int (*)[5],即{。}} 指向int[5]数组的指针。

你的函数是双指针int **cartao2。这种类型不一样 int (*)[5],你的编译器应该用

警告你
a.c:21:11: warning: passing argument 1 of ‘Mudar’ from incompatible pointer type [-Wincompatible-pointer-types]
     Mudar(&cartao);
           ^
a.c:3:6: note: expected ‘int **’ but argument is of type ‘int (*)[5]’
 void Mudar (int **cartao2)
      ^~~~~

Mudar看到一个双指针,当你做

*cartao2[2] = 3;

你正在做cartao2[2][0] = 3,但因为你没有传递正确的类型, 你在内存中的错误位置取消引用并写入你不应该写的地方。你必须写你的 功能如下:

void Mudar (int (*cartao2)[5])
{
    cartao2[0][0] = 5; // or (*cartao2)[0] = 5;
    cartao2[0][1] = 4; // or (*cartao2)[1] = 4;
    cartao2[0][2] = 3; // or (*cartao2)[2] = 3;
    cartao2[0][3] = 2; // or (*cartao2)[3] = 2;
    cartao2[0][4] = 1; // or (*cartao2)[4] = 1;
}

在这种情况下,函数需要一个指向int[5]的指针。请注意,如果你 声明它接受指向任何大小的数组的指针,你必须这样做 将其声明为

void Mudar(int (*cartao2)[], size_t len)
{
    for(size_t i = 0; i < len; ++i)
        (*cartao2)[i] = 10*i;
}

在这种情况下,您不能使用符号cartao2[0][i],因为编译器 不知道数组的实际大小,但(*cartao2)[i]有效。

答案 1 :(得分:2)

与简单的标量变量(如cartao)不同,数组作为指针传递,因此您不需要传递cartao的地址以更新其内容。现在,如果您想要更改指向的内存块void Mudar(int *cartao2) { cartao2[0] = 5; cartao2[1] = 4; cartao2[2] = 3; cartao2[3] = 2; cartao2[4] = 1; } Mudar(cartao); ,那么您需要传入其地址。

int cartao[] = {1,2,3,4,5};
int cartao[] = {5,4,3,2,1};

输出:

{{1}}

答案 2 :(得分:0)

对于2D数组,试试这个。 M是行,n是列。 在泥巴功能。

 for (i = 0; i < m; i++)
  for (j = 0; j < n; j++)
    *((arr+i*n) + j) =aux;