0

可能的重复:
C 中用于获取字符串的指针算法

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

有什么帮助吗?我需要使用指针的算术。谢谢

4

5 回答 5

1

首先,不要在有问题时更新代码来修复错误。它使当前的大多数答案变得毫无意义,不会因解决您先前代码中的一个或多个问题的人而给予信任,并使寻找与自己相关的问题的普通读者完全困惑通过其中的问题和答案。如果您想修改原始问题之外的更新,但如果它是一个完全不同的问题,则标记为已回答,在到期时给予信用,并使用您的新代码和其他问题打开一个新问题(s )(理想情况下,无论如何)。

如现在所写,您的功能很好。但你真正的问题是:

// 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 *. 此外,如果您在编译之前的代码时将完整的警告视为错误(-Wall -Werror对于 gcc),您将在v声明行中收到如下错误:

main.c:116:15: Excess elements in scalar initializer

换句话说,第一个元素之后的所有内容都被忽略了,因此您的指针正在运行到未定义的行为区域。将声明和调用更改为我上面的内容将解决这个问题,并确保您不会再犯该错误,因为除非是数组或指针类型,否则sizeof(v[0])甚至不会编译。v当您使用指针而不是数组进行这样的计算时,后者仍然会引起头痛,但这是您必须约束自己不要在 C 中做的事情。

于 2012-12-13T06:09:05.540 回答
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));
    }
}
于 2012-12-13T04:48:52.220 回答
0

实际上你正在传递数组地址

getelements(&v,5) 

在功能上

getelements() 

你把它当作一个数组对待!!!

void getelements(int *a, int cl)
{
    int *p;
    for (p=a;p<a+cl;p++)
    {
         printf("%d\n",*p);
    }
}

让我知道你是否在概念上被清除了!!!

于 2012-12-13T05:01:02.310 回答
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);
    }
}
于 2012-12-13T04:41:56.547 回答
0

试试这个,让我知道它是否有效。

void getelements(int *a)
{
    int *p;
    int l=5;
    for (p=a;p<a+l;p++)
    {
         printf("%d\n",*p);
    }
}
于 2012-12-13T04:43:28.197 回答