Почему предложение const не работает, если я пытаюсь использовать его, когда хочу защитить модификацию вектора? - PullRequest
2 голосов
/ 30 октября 2019

В книге, которую я изучаю, говорится, что если я передаю вектор функции, имя вектора всегда рассматривается как указатель. На самом деле это так. Но я не могу понять, почему в первой функции предложение 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;
}

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Поскольку vettore является указателем на const int, вы должны сделать i того же типа.

const int *i;
int max = *vettore;

for(i = vettore; i < vettore + n; i++)
0 голосов
/ 30 октября 2019

Короткая версия: Добавление квалификатора 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 * vettore into non-const 'int *i. Это может позволить модифицировать вектор константы (например, *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 на const int *i. Смотри выше.

...