Постоянный указатель против указателя на константу [дубликат]


этот вопрос уже есть ответ здесь:

Я хочу знать разницу между

const int* ptr;

и

int * const ptr; 

и как это работает.

мне довольно трудно понять или запомнить это. Пожалуйста помочь.

8 66

8 ответов:

const int* ptr; 

объявляет ptr указатель const int тип. Вы можете изменить но объект, на который указывает ptr не подлежит изменению.

const int a = 10;
const int* ptr = &a;  
*ptr = 5; // wrong
ptr++;    // right  

пока

int * const ptr;  

объявляет ptr a const указатель int тип. Вы не имеете права изменять ptr но объект, на который указывает ptr.

int a = 10;
int *const ptr = &a;  
*ptr = 5; // right
ptr++;    // wrong

вообще я бы предпочел объявление, как это, которые делают его легко читать и понимать (читать с справа налево):

int const  *ptr; // ptr is a pointer to constant int 
int *const ptr;  // ptr is a constant pointer to int
const int * ptr;

означает, что указанные данные являются постоянными и неизменяемыми, а указатель-нет.

int * const ptr;

означает, что указатель является постоянным и неизменяемым, но указал данные не.

1) Постоянные Указатели : эти типы указателей являются тот, который не может изменить адрес, на который они указывают. Это означает, что, допустим, есть указатель, который указывает на переменную (или хранит адрес переменной). Теперь, если мы попытаемся указать указатель на какую-либо другую переменную (или попытаться сделать указатель адресом хранения какой-либо другой переменной), то постоянные указатели на это неспособны.

постоянный указатель объявляется так : int *const ptr ( расположение 'const' сделать указатель ' ptr ' как постоянный указатель)

2) указатель на константу : эти типы указателей являются тот, который не может изменить значение, на которое они указывают. Это означает, что они не могут изменить значение переменной, адрес которой они держатся.

указатель на константу объявляется как:const int *ptr (расположение 'const' делает указатель ' ptr ' в качестве указателя на постоянный.

пример

Постоянный Указатель

#include<stdio.h>

int main(void)
{
    int a[] = {10,11};
    int* const ptr = a;

    *ptr = 11;

    printf("\n value at ptr is  : [%d]\n",*ptr);
    printf("\n Address pointed by ptr  : [%p]\n",(unsigned int*)ptr);

    ptr++;
    printf("\n Address pointed by ptr  : [%p]\n",(unsigned int*)ptr);

    return 0;
}

теперь, когда мы скомпилировать приведенный выше код, компилятор жалуется :

practice # gcc -Wall constant_pointer.c -o constant_pointer
constant_pointer.c: In function ‘main’:
constant_pointer.c:13: error: increment of read-only variable ‘ptr’

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

указатель на константы

#include<stdio.h>

int main(void)
{
    int a = 10;
    const int* ptr = &a;


    printf("\n value at ptr is  : [%d]\n",*ptr);
    printf("\n Address pointed by ptr  : [%p]\n",(unsigned int*)ptr);

    *ptr = 11;

    return 0;
}

теперь, когда приведенный выше код компилируется, компилятор жалуется :

practice # gcc -Wall pointer_to_constant.c -o pointer_to_constant
pointer_to_constant.c: In function ‘main’:
pointer_to_constant.c:12: error: assignment of read-only location ‘*ptr’

следовательно, и здесь мы видим, что компилятор не позволяет указателю на константу изменять значение указываемой переменной.

цитата

версии от Этой Теме

Константными Указателями

давайте сначала поймем, что такое постоянный указатель. Постоянный указатель-это указатель, который не может изменить адрес, который он держит. Другими словами, мы можем сказать, что если постоянный указатель указывает на переменную, то он не может указывать на любую другую переменную.

постоянный указатель объявляется следующим образом :
<type of pointer> * const <name of pointer>
Пример объявления будет выглядеть так:
int * const ptr;
Давайте возьмем небольшой код, чтобы проиллюстрировать эти типы указателей:

#include<stdio.h>

int main(void)
{
    int var1 = 0, var2 = 0;
    int *const ptr = &var1;
    ptr = &var2;
    printf("%d\n", *ptr);

    return 0;
} 

В приведенном выше примере :

  • мы объявили две переменные var1 и var2
  • постоянный указатель ' ptr ' был объявлен и сделан в точку var1
  • далее, ptr делается для точки var2.
  • наконец, мы пытаемся напечатать значение ptr указывает к.

указатель на константу

как видно из названия, указатель, через который нельзя изменить значение переменной, на которую он указывает, известен как указатель на константу. Эти типы указателей могут изменить адрес, на который они указывают, но не могут изменить значение, хранящееся на этом адресе.

указатель на константу определяется как : const <type of pointer>* <name of pointer> Примером определения может быть : const int* ptr; Давайте возьмем небольшой код проиллюстрируйте указатель на константу:

 #include<stdio.h>

int main(void)
{
    int var1 = 0;
    const int* ptr = &var1;
    *ptr = 1;
    printf("%d\n", *ptr);

    return 0;
} 

в коде выше:

  • мы определили переменную var1 со значением 0
  • мы определили указатель на константу, которая указывает на переменную var1
  • теперь с помощью этого указателя мы попытались изменить значение var1
  • используется printf для печати нового значения.
const int* ptr;

- указатель на константу (содержимое). Вы можете изменить указатель. например,ptr = NULL,ptr++, но изменение содержания не возможно.

int * const ptr;

постоянный указатель. Возможно и обратное. Ты -не разрешено изменять указатель, но вы are позволено изменять то, что он указывает, например,*ptr += 5.

int i;
int j;

int * const ptr1 = &i;

компилятор остановит вас меняется ptr1.

const int * ptr2 = &i;

компилятор остановит вас меняется *ptr2.

ptr1 = &j; // error
*ptr1 = 7; // ok

ptr2 = &j; // ok
*ptr2 = 7; // error

обратите внимание, что вы все еще можете изменить *ptr2, только не буквально набрав *ptr2:

i = 4;
printf("before: %d\n", *ptr2); // prints 4
i = 5;
printf("after: %d\n", *ptr2); // prints 5
*ptr2 = 6; // still an error

вы также можете иметь указатель с обеими функциями:

const int * const ptr3 = &i;

ptr3 = &j; // error
*ptr3 = 7; // error

пожалуйста, обратитесь к следующей ссылке для лучшего понимания разницы между указателем Const и указателем на постоянное значение.

постоянный указатель против указателя на константное значение

const int* ptr; здесь думаю, как *ptr является постоянным и *ptr не может быть изменен снова

int * const ptr; пока вот думаю как ПТР в качестве константы, и что нельзя изменить