Почему const не работает, даже если переменная не изменилась? - PullRequest
0 голосов
/ 10 ноября 2019

Я пытаюсь защитить массив -a- функции my_sum_array от изменений. В функциональном блоке я не делаю никаких изменений в -a-, но у меня есть предупреждение (предупреждение: присваивание 'int *' из 'const int *' отбрасывает квалификаторы [-Wincompatible-pointer-types-discards-qualifiers]). Я знаю, что могу удалить const, чтобы программа работала, но я хотел бы понять, если что-то мне не хватает.

#include <stdio.h>

#define MAX 5

int my_sum_array(const int a[], int n);

int main(void) {
    int values[5] = {4, 7, 1, 7, 8};

    printf("The sum in my_sum_array is :%d\n", my_sum_array(values, MAX));

    return 0;
}

int my_sum_array(const int a[], int n) {
    int *p, sum = 0;

    for (p = a; p < a + n; p++)
        sum += *p;

    return sum;
}

Ответы [ 3 ]

2 голосов
/ 10 ноября 2019

Предупреждение вызвано присваиванием p = a в цикле for. Переменная определяется как int *p, указатель на неконстантный int. Предупреждение правильное: «присвоение int * из const int * отбрасывает квалификаторы». Это как если бы вы отбросили константу параметра указателя a.

Я бы изменил вашу функцию на:

int my_sum_array(const int a[], int n) {
    int sum = 0;

    for (const int *p = a; p < a + n; p++)
        sum += *p;

    return sum;
}

Это определяет p как указатель-to-const, как и a, и также ограничивает свое время жизни циклом for.

1 голос
/ 10 ноября 2019

Сделайте ваш p указатель следующим образом:

    int const * p;

т.е.

здесь, p - это указатель на constцелое число

0 голосов
/ 10 ноября 2019

Измените тип p на:

const int *p;

Так что теперь вы получите:

const int * p;
int sum = 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...