3

这是在采访中被问到的。就像从右到左阅读的想法一样,我可以解释

char *const *p declares p as pointer to constant pointer of character.

尽管

char * *const p declares p as a constant pointer to character pointer. 

但由于我没有得到这些的确切含义,所以请验证它。

4

3 回答 3

5

char * const *p表示指向的字符指针p不能改变。

char arr[] = "";
char *ptr = arr;
char * const *p = &ptr;
**p = '\0';             // ok
*p = 0;                 // error
p = 0;                  // ok

char ** const p表示p无法更改。

char arr[] = "";
char *ptr = arr;
char ** const p = &ptr;
**p = '\0';             // ok
p = 0;                  // error
*p = 0;                 // ok, ptr is now NULL
于 2013-06-26T08:33:53.983 回答
3

在我发现cdecl之前,我在 C 中声明复杂指针时常常会在屏幕上撞到我的头:)

char *const *p  // -> declare p as pointer to const pointer to char
char * *const p // -> declare p as const pointer to pointer to char

您也可以安装它。

干杯!

于 2013-06-26T08:38:01.673 回答
0

我使用以下代码对此进行了测试:

main()
{
  char *const *p;
  char **const q;

  **p = 'a';
  *p = *q;
  p = q;

  **q = 'a';
  *q = *p;
  q = p;
}

GCC 在第 7 行和第 12 行对我大喊大叫,即*p = *qq = p. 所以看起来你是对的。*p是恒定的,并且q是恒定的。

(是的,我知道我的程序有未定义的行为,因为我取消引用未初始化的指针。这不是重点,hhhehehe。)

于 2013-06-26T08:33:56.367 回答