char *const *p和char ** const p的区别

3
在一次面试中曾被问到这个问题。就像从右到左阅读的想法,我可以理解。
char *const *p declares p as pointer to constant pointer of character.

while

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

但由于我没有完全理解这些内容的确切含义,请您核实。

1
尝试在两种情况下编译p [0] = 0 - gukoff
@Daniel:但两者都是指向指针的指针。区别在于const的放置位置。 - cha0site
1
实际上,你理解得很好。你给出的定义是 jxh 答案在普通英语中的确切翻译 ;) - Rerito
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

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

你也可以安装它。
祝好!

不客气 :) 你也可以使用它从普通英语描述中获取C声明,我曾经用它构建非常复杂的变量声明,只是为了恼怒一个同事 :p - Belkacem REBBOUH

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。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接