如何在C中正确使用指针?

时间:2017-02-15 18:26:40

标签: c pointers

我有这个代码应该找到数组中的最小整数。我正在学习如何在C中使用指针,我的代码将无法编译,但我不知道为什么。我不想回答问题,而是想知道我为什么做错了,或者我的思维过程是怎么回事。

我认为*p_min会返回地址内的值。

我得到的错误:

error: invalid type argument of ‘unary *’ (have ‘int’)

Warning: return makes pointer from integer without a cast

p在函数外声明为int * p;

代码:

int *find_smallest(int a[], int N)
{
    int *p_min;

    for (p = &a[0]; p < &a[N]; p++)
    {
        if (*p[1] < *p[0]) {
            p_min = &p[1];
            return *p_min;
        } else {
            p_min = &p[0];
            return *p_min;
        }
    } 
}

3 个答案:

答案 0 :(得分:4)

不确定你在比较逻辑上做了什么。最直接的方法是从第一个元素开始,然后按顺序检查其余元素,保留较小元素的索引。我的代码是这样的:

int *find_smallest(int a[], int N)
{
    /* Make sure the input is valid */
    if (a && N > 0)
    {
        int i, N_min = 0;
        /* Check the rest of the elements */
        for (i = 1; i < N; i++)
        {
            /* If this one is lower, save the index */
            if (a[i] < a[N_min])
                N_min = i;
        }
        /* Return pointer to minimum */
        return a + N_min;
    }
    /* Return NULL to indicate an error */
    return NULL;
}

答案 1 :(得分:0)

  • *p[1] < *p[0]应为*(p+1) < *pp[1] < p[0]
  • 返回类型应为int
  • 你在循环一遍之后无条件地返回。
  • 您从未声明p
  • 请注意,&a[i]可以写为a+i
  • 您应该比较p[0](又名*p)和*p_min,而不是p[0]p[1]
  • p[1]甚至可能超出阵列的末尾!
  • 您没有初始化p_min
  • 没有理由让int* p_min;代替int min;

修正:

int find_smallest(int a[], int N) {
    int min = a[0];  // Assumes a[] will have at least one element.
    for (int* p=a; p<a+N; ++p) {
        if (*p < min) min = *p;
    } 

    return min;
}

或者只是:

int find_smallest(int a[], int N) {
    int min = a[0];  // Assumes a[] will have at least one element.
    for (int* p=a; N--; ++p) {
        if (*p < min) min = *p;
    } 

    return min;
}

或者,可以使用索引而不是指针。

int find_smallest(int a[], int N) {
    int min = a[0];  // Assumes a[] will have at least one element.
    for (int i=0; i<N; ++i) {
        if (a[i] < min) min = a[i];
    } 

    return min;
}

或者只是:

int find_smallest(int a[], int N) {
    int min = a[0];  // Assumes a[] will have at least one element.
    for (int i=N; i--; ) {
        if (a[i] < min) min = a[i];
    } 

    return min;
}

答案 2 :(得分:-4)

此代码存在许多问题(以及需要改进的地方)。这很令人困惑,所以我不完全确定你要做什么,但我会指出你应该开始的一些地方。

  • 只是一个警告,如果您想要修改数组,find_smallest(int a[], int N)将无法执行*,您需要find_smallest(int (*a)[], int N);之类的内容,然后您可以像(*a)[some_index]一样访问。
  • 您的函数表示它返回int *,但我看到的return两个值int
  • p在哪里宣布?
  • 为什么您需要使用&a[0]而不只是a[0],如果你所做的只是找到数组中的最小值?
  • 您一直在尝试访问*a[some_index]。看起来你打算按照我的说法通过它。以*a[some_index]访问它会导致各种错误,您需要编写(*a)[some_index]之类的内容。这就是C如何识别指针。
  • 如果你以任何一种方式返回*p_min,你都不应该将return放在if语句中,因为它只会减慢编译器的速度浪费空间。

*如果您像int a[]一样传递它,该函数将只有变量的本地副本,并且无法修改它。这会导致很多令人困惑的错误,所以如果你想把你的函数发展成更大的东西,这是需要考虑的事情。