В чем разница между char * const и const char *? - PullRequest
250 голосов
/ 21 мая 2009

Какая разница между:

char * const 

и

const char *

Ответы [ 18 ]

1 голос
/ 21 июля 2016

Модификатор const применяется к термину непосредственно слева от него. Единственное исключение из этого - когда слева ничего нет, тогда это относится к тому, что находится непосредственно справа.

Это все эквивалентные способы сказать «постоянный указатель на постоянную char»:

  • const char * const
  • const char const *
  • char const * const
  • char const const *
1 голос
/ 27 ноября 2015

char * const и const char *?

  1. Указывает на постоянное значение

const char * p; // значение не может быть изменено

  1. Постоянный указатель на значение

char * const p; // адрес не может быть изменен

  1. Постоянный указатель на постоянное значение

const char * const p; // оба не могут быть изменены.

1 голос
/ 23 октября 2015
  1. Указатель константы : Указатель константы может указывать только на одну переменную соответствующего типа данных в течение всей программы. Мы можем изменить значение переменной, указанной указателем. Инициализация должна быть сделана во время самого объявления.

Синтаксис:

datatype *const var;

char *const подпадает под этот случай.

/*program to illustrate the behaviour of constant pointer */

#include<stdio.h>
int main(){
  int a=10;
  int *const ptr=&a;
  *ptr=100;/* we can change the value of object but we cannot point it to another variable.suppose another variable int b=20; and ptr=&b; gives you error*/
  printf("%d",*ptr);
  return 0;
}
  1. Указатель на постоянное значение : в этом указатель может указывать любое количество переменных соответствующего типа, но мы не можем изменить значение объекта, на который указывает указатель в это конкретное время.

Синтаксис:

const datatype *var или datatype const *var

const char* относится к этому случаю.

/* program to illustrate the behavior of pointer to a constant*/

   #include<stdio.h>
   int main(){
       int a=10,b=20;
       int const *ptr=&a;
       printf("%d\n",*ptr);
       /*  *ptr=100 is not possible i.e we cannot change the value of the object pointed by the pointer*/
       ptr=&b;
       printf("%d",*ptr);
       /*we can point it to another object*/
       return 0;
    }
1 голос
/ 21 мая 2009

Полагаю, вы имеете в виду const char * и char * const.

Первый, const char *, является указателем на постоянный символ. Сам указатель является изменяемым.

Второе, char * const - это постоянный указатель на символ. Указатель не может измениться, символ, на который он указывает, может.

И затем есть const char * const, где указатель и символ не могут измениться.

1 голос
/ 17 ноября 2016

Два правила

  1. If const is between char and *, it will affect the left one.
  2. If const is not between char and *, it will affect the nearest one.

, например

  1. char const *. This is a pointer points to a constant char.
  2. char * const. This is a constant pointer points to a char.
1 голос
/ 20 января 2018

Я хотел бы отметить, что использование int const * (или const int *) не относится к указателю, указывающему на переменную const int, но что эта переменная const для этого конкретного указателя.

Например:

int var = 10;
int const * _p = &var;

Приведенный выше код прекрасно компилируется. _p указывает на переменную const, хотя сам var не является константой.

1 голос
/ 04 марта 2013

Вот подробное объяснение с кодом

/*const char * p;
char * const p; 
const char * const p;*/ // these are the three conditions,

// const char *p;const char * const p; pointer value cannot be changed

// char * const p; pointer address cannot be changed

// const char * const p; both cannot be changed.

#include<stdio.h>

/*int main()
{
    const char * p; // value cannot be changed
    char z;
    //*p = 'c'; // this will not work
    p = &z;
    printf(" %c\n",*p);
    return 0;
}*/

/*int main()
{
    char * const p; // address cannot be changed
    char z;
    *p = 'c'; 
    //p = &z;   // this will not work
    printf(" %c\n",*p);
    return 0;
}*/



/*int main()
{
    const char * const p; // both address and value cannot be changed
    char z;
    *p = 'c'; // this will not work
    p = &z; // this will not work
    printf(" %c\n",*p);
    return 0;
}*/
0 голосов
/ 23 апреля 2015
// Some more complex constant variable/pointer declaration.
// Observing cases when we get error and warning would help
// understanding it better.

int main(void)
{
  char ca1[10]= "aaaa"; // char array 1
  char ca2[10]= "bbbb"; // char array 2

  char *pca1= ca1;
  char *pca2= ca2;

  char const *ccs= pca1;
  char * const csc= pca2;
  ccs[1]='m';  // Bad - error: assignment of read-only location ‘*(ccs + 1u)’
  ccs= csc;    // Good

  csc[1]='n';  // Good
  csc= ccs;    // Bad - error: assignment of read-only variable ‘csc’

  char const **ccss= &ccs;     // Good
  char const **ccss1= &csc;    // Bad - warning: initialization from incompatible pointer type

  char * const *cscs= &csc;    // Good
  char * const *cscs1= &ccs;   // Bad - warning: initialization from incompatible pointer type

  char ** const cssc=   &pca1; // Good
  char ** const cssc1=  &ccs;  // Bad - warning: initialization from incompatible pointer type
  char ** const cssc2=  &csc;  // Bad - warning: initialization discards ‘const’
                               //                qualifier from pointer target type

  *ccss[1]= 'x'; // Bad - error: assignment of read-only location ‘**(ccss + 8u)’
  *ccss= ccs;    // Good
  *ccss= csc;    // Good
  ccss= ccss1;   // Good
  ccss= cscs;    // Bad - warning: assignment from incompatible pointer type

  *cscs[1]= 'y'; // Good
  *cscs= ccs;    // Bad - error: assignment of read-only location ‘*cscs’
  *cscs= csc;    // Bad - error: assignment of read-only location ‘*cscs’
  cscs= cscs1;   // Good
  cscs= cssc;    // Good

  *cssc[1]= 'z'; // Good
  *cssc= ccs;    // Bad - warning: assignment discards ‘const’
                 //                qualifier from pointer target type
  *cssc= csc;    // Good
  *cssc= pca2;   // Good
  cssc= ccss;    // Bad - error: assignment of read-only variable ‘cssc’
  cssc= cscs;    // Bad - error: assignment of read-only variable ‘cssc’
  cssc= cssc1;   // Bad - error: assignment of read-only variable ‘cssc’
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...