gpt4 book ai didi

在c中更改int数组中的值

转载 作者:太空宇宙 更新时间:2023-11-04 00:58:45 24 4
gpt4 key购买 nike

我想了解数组中的值/指针管理。

想象一个包含 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

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

最佳答案

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] 有效。

关于在c中更改int数组中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48917242/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com