【问题标题】:Why does the const clause not work if I try to use it when I want to protect the modification of a vector?如果我想保护对向量的修改时尝试使用 const 子句,为什么它不起作用?
【发布时间】:2020-02-25 08:42:00
【问题描述】:

在我正在研究的书中说,如果我将向量传递给函数,则向量的名称始终被视为指针。 事实上就是这样。 但是我不明白为什么在第一个函数中编译器允许使用 const 子句,而在第二个函数中(我使用指针来搜索元素之间的最大值)没有。 在函数中,我只是想防止修改向量。

#include <stdio.h>

int find_largest(const int a[], int n);
int find_largest_with_pointer(const int *vettore, int n);

int main(void) {
    int my_number[] = {5, 7, 90, 34, 12};
    int n = sizeof(my_number) / sizeof(my_number[0]);
    int *pmy_number = my_number;

    printf("%d\n", find_largest(my_number, n));
    printf("%d\n", find_largest(pmy_number, n));
    printf("%d\n", find_largest_with_pointer(my_number, n));
    printf("%d\n", find_largest_with_pointer(pmy_number, n));

    return 0;
}

int find_largest(const int a[], int n) {
    int i, max;
    max = a[0];

    for(i = 0; i < n; i++)
        if(a[i] > max)
            max = a[i];

    return max;
}

int find_largest_with_pointer(const int *vettore, int n) {
    int *i, max = *vettore;

    for(i = vettore; i < vettore + n; i++)
        if(*i > max)
            max = *i;

    return max;
}

【问题讨论】:

  • 编译器错误应该很清楚地告诉你你做错了什么以及为什么。

标签: c arrays pointers parameter-passing cc


【解决方案1】:

由于vettore 是指向const int 的指针,因此您必须使i 具有相同的类型。

const int *i;
int max = *vettore;

for(i = vettore; i < vettore + n; i++)

【讨论】:

    【解决方案2】:

    短版:添加 const 限定符将解决编译器警告。

    int find_largest_with_pointer(const int *vettore, int n) {
    //    int *i, max = *vettore;
        const int *i ;
        int max = *vettore;
        ...
    }
    

    加长版:

    在第二个函数中,您使用了两个变量。稍微扩展一下代码

       int *i ;l
       it max = a[0] ;
       for (
           i = vettore;
           i < vettore + n;
           i++
       ) { ... }
    

    注意i = vettore 行,它将尝试复制'const int * vettoreinto non-const 'int *i。这有可能允许修改 const 向量(例如*i = 5),编译器抱怨:

    c.c:33:11: warning: assignment discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
         for(i = vettore; i < vettore + n; i++)
    

    解决方案很简单:在const int *i 上添加 const 限定符。见上文。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多