2014-11-04 3 views
3

На самом деле я не знаю, в чем разница между нормальным указателем и указателем const , если я использую приведенный ниже код, он будет работать нормально. но когда я меняю int *ptr=# на int *const ptr = &var1;, тогда это не сработает. может ли кто-нибудь объяснить, в чем разница между нормальным указателем и указателем const?Разница между нормальным указателем и указателем const в c

int main(void) 
    { 
     int num = 20; 
    int *ptr = &num ; // if i change to `int *const ptr = &var1;` then it shows some error 

    *ptr = 20 ;    // Valid 
    ptr ++ ;     // valid 

     return 0; 
    } 

ответ

5
int* const ptr = &num ; 

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

Вы не можете изменить указатель:

ptr++ ; 

Но вы можете изменить данные:

*ptr = 1234 ; 
+0

можно сказать, у я на самом деле, где используются указатели const –

+0

@ArunPrasanth Если вы знаете, что указатель всегда должен указывать на одно и то же место, вы можете сделать его const. – 2501

1

Это:

int* const ptr = &num ; 

создаст константный указатель на целое число , Вы можете использовать его для изменения значения целого, но вы не можете изменить, где указатель указывает, поэтому ptr++ ; недействителен.

Ключевое слово const обычно применяется к его левому символу, например.

int * const ptr; // A constant pointer (*) 
int const * ptr; // A pointer to a constant integer 
int const * const ptr; // A constant pointer to a constant integer 
const int *ptr; // Shorthand for pointer to a constant integer (equivalent to int const * ptr;) 

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

+1

Спасибо за ваш быстрый повтор –

1

с., const - type qualifier. использование const в некоторых средствах определения переменной, переменная не будет изменена (будет обрабатываться как read-only) в течение всего срока службы программы.

Обычно, при определении типа переменной/данных с помощью const, приоритет должен инициализировать его с требуемым значением, как обычно, его значение не может быть изменено в более поздней части.

Например:

const int a = 10;

означает, целое число a будет содержать значение 10 и он не может быть изменен. в более поздней части,

a = 20; 

будет вызывать ошибку.

Таким образом, в вашем случае

int *const ptr = &var; 

здесь, ptr всегда будет содержать адрес var и не может быть изменен, т.е., Мы не можем написать

ptr = &num2; // where num2 is another int, declared like int num2; 

он будет показывать ошибку во время компиляции, как:

error:assignment of read-only variable "*ptr".

Вы можете найти хорошее и удобное описание here.

3

Мы можем сделать следующие операции на постоянных указателей

  • Присвоение значения по адресу
  • стоимость печати или адрес
  • Присвоение адреса в момент декларации.

Мы Может не на следующие операции на постоянных указателей

  • Добавление типа Integer в постоянных указателей.
  • Вычитание целых чисел в постоянные указатели.
  • Любая операция, которая может изменить адрес указателя.

Итак, вот ваш вопрос ..

Если вы объявляете

int* const ptr = &num ; // this is ok 

следующую строку

*ptr = 20 ; // Assigning value at address this is ok 

Теперь,

ptr ++ ; // you can not change the value // Error! 

Ho Это помогает!

1
int* const pointer = &x ; 

создает постоянный указатель на int. Данные, которые он указывает может быть изменен, но указатель оно само не может быть изменен

Вы не можете изменить указатель:

pointer++ ; 

здесь вы можете изменить данные:

*pointer=1 ;