用于在C中获取数组元素的指针

时间:2012-12-13 04:37:08

标签: c pointers

  

可能重复:
  pointer arithmetic in C for getting a string

我是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);

有任何帮助吗?我需要使用指针算法。 感谢

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);
    }
}

如果您在概念上被清除,请告诉我!!!