我是C的新手,我想用函数获取数组的元素,我尝试了不同的选项,但我仍然没有得到这些元素。 我的职责是:
void getelements(int *a, int cl)
{
int *p;
for (p=&a[0];p<&a[cl];p++)
{
printf("%d\n",*p);
}
}
我知道解决方案应该像这样工作,但它只打印第一个元素,然后打印内存位置。我用以下方法调用我的函数:
int v={10,12,20,34,45};
getelements(&v,5);
有任何帮助吗?我需要使用指针算法。 感谢
答案 0 :(得分:1)
首先,请在问题打开时不要更新代码来修复错误。它使大多数当前的答案毫无意义,不会因为解决前一代码中的一个或多个问题的人而给予信用,并使随意读者找到一个相关的问题给自己完全混淆通过问题和答案。如果您想修改更新,请在添加中解决原始问题,但如果这是一个完全不同的问题,请将其标记为已解答,并在应收的位置给予信用,并在您的问题中打开一个新问题新代码和不同的问题(理想情况下,无论如何)。
现在写的,你的功能很好。但你真正的问题是:
// compile with -Wall -Werror and look at the warning here
int v={10,12,20,34,45}; // <== WRONG
getelements(&v,5); // <== Harmless, but bad form.
这应该是这样的,假设您要在数组中打印所有元素:
int v[] = {10,12,20,34,45};
getelements(v, sizeof(v)/sizeof(v[0]));
请注意数组后面的[]
。没有它,&v
掩盖了int
作为int *
传递的编译器的大胖警告或错误。此外,如果您编译先前的代码并将完整警告视为错误(gcc为-Wall -Werror
),您将在v
声明行中收到如下错误:
main.c:116:15: Excess elements in scalar initializer
换句话说,忽略了第一个元素之后的所有内容,因此您的指针运行到未定义的行为域。将声明和调用更改为上面的内容将解决此问题,并确保您不会再犯错误,因为sizeof(v[0])
甚至不会编译,除非v
是一个数组或指针类型。当你使用一个指针而不是一个带有这种计算的数组时,后者仍然会引起头痛,但这只是你必须遵守C中的事情。
答案 1 :(得分:0)
最好将数组的长度与数组本身一起传递。
#include <stdlib.h>
#include <stdio.h>
void get_elements(int* values, int length)
{
int i;
for (i = 0; i < length; ++i)
{
printf("%d\n", values[i]);
}
}
int main(int argc, char** argv)
{
int vals[3];
vals[0] = 0;
vals[1] = 1;
vals[2] = 2;
get_elements(vals, 3);
getchar();
return 0;
}
使用类似于原始帖子的代码(在添加数组长度作为方法参数之前),您可以执行以下操作(如果您问我,这有点令人费解。)
void get_elements(int* values, int length)
{
int *p;
for (p = &values[0]; p < &values[length]; p++)
{
printf("%d\n", *p);
}
}
答案 2 :(得分:0)
尝试这个,让我知道这是否有效。
void getelements(int *a)
{
int *p;
int l=5;
for (p=a;p<a+l;p++)
{
printf("%d\n",*p);
}
}
答案 3 :(得分:0)
根据我的知识并看到你的代码。你已经将数组的长度硬编码为5.我认为你也可以将数组长度作为参数传递给函数;或者您可以使用此功能,看看它是否给出了所需的结果
void getelements(int *a)
{
int *p;
int i = 0;
int l=5;
p = a
for (i = 0;i<l;i++)
{
printf("%d\n",*(p + i));
}
}
答案 4 :(得分:0)
实际上你在
中传递数组地址getelements(&v,5)
在功能
getelements()
你把它当作阵列对待!!!
void getelements(int *a, int cl)
{
int *p;
for (p=a;p<a+cl;p++)
{
printf("%d\n",*p);
}
}
如果您在概念上被清除,请告诉我!!!