2016-04-30 3 views
0
#include<stdio.h> 
void foo(int **p) 
{ 
    int j=11; 
    *p = &j; 
    printf("%d ", **p); 
} 
int main(void) 
{ 
    int i = 10; 
    int *const p = &i; 
    foo(&p); 
    printf("%d ", *p); 
    return 0; 
} 

На компиляции:предупреждение: передавая аргумент 1 из 'сопзЬ' классификатором 'Foo' отбрасывает от указателя целевого типа

example.c:12:2: warning: passing argument 1 of ‘foo’ discards ‘const’ qualifier from pointer target type [enabled by default] 
    foo(&p); 
example.c:2:6: note: expected ‘int **’ but argument is of type ‘int * const*’ 
    void foo(int **p) 

В перспективе:

11 11 

Здесь р является постоянным указателем поэтому почему нет ошибки для изменения его содержания и только для предупреждения?

Мои сомнения по указанной выше программе из-за следующей программе:

#include<stdio.h> 
int main(void) 
{ 
    int var1 = 0, var2 = 0; 
    int *const ptr = &var1; 
    ptr = &var2; 
    printf("%d\n", *ptr); 
    return 0; 
} 

На компиляции:

error: assignment of read-only variable ‘ptr’ 
    ptr = &var2; 
+0

[post] (http://stackoverflow.com/questions/7736049/const-char-pointer-assignments/7738315#7738315) может быть полезно –

ответ

0

int * const p; означает Const указатель на Int, где р не может указывать на другое место , Итак, вы получили предупреждение.

+0

Хорошая точка. Но это не полностью решает вопрос – sjsam

0

Почему нет ошибки здесь для изменения постоянного местоположения и только просто предупреждение?

Случай 1.

На самом деле в:

void foo(int **p) // p is a pointer to pointer to int 
{ 
    int j=11; 
    *p = &j; //equivalent of p = &i in main() 
    printf("%d ", **p); 
} 

Вы не изменяя значение p в основном. Ты?

По

*p = &j; 

Вы просто изменить значение, сохраненное в р main() «s.

Вариант 2

ptr = &var2; // You are making ptr point to the memory address of &var2 

Это незаконно, как ptr является constant.

0

int * const p является константным указателем на int (расположение p является только для чтения)

прототип foo должен быть

void foo(int * const *p) -> указатель на константный указатель на int (расположение *p является только для чтения)

*p = &j; 

error: assignment of read-only location ‘*p’ 

Но это справедливо:

**p = j; -> разыменования *p = доступ к i в main

Вы ищете:

#include <stdio.h> 

void foo(int * const *p) 
{ 
    int j = 11; 

    **p = j; 
    printf("%d ", **p); 
} 

int main(void) 
{ 
    int i = 10; 
    int * const p = &i; 

    foo(&p); 
    printf("%d ", *p); 
    return 0; 
} 

Выход:

11 11 

То же самое для

int var1 = 0, var2 = 0; 
int *const ptr = &var1; 
ptr = &var2; <-- You can not change the location of ptr 
0

Почему нет ошибки при изменении его содержимого и только просто предупреждение?

В 1-ом случае вы получите предупреждение «только» как вы только подготовить маршрут к катастрофе, передавая const в контекст, где он может быть неправильно использованы, то есть быть назначено что-то. Однако неясно, действительно ли что-то назначено.

Во втором случае код на самом деле делает, что он не может, то есть назначает const, поэтому компилятор рассматривает его как ошибку.

Смежные вопросы