查看char **指针链的两种方法可以混合使用指针类型吗?

时间:2018-03-25 21:44:57

标签: c pointers

假设我有变量声明Hash。这是否意味着char **p是指向p指针的指针,或者char是指向指向p的某种类型指针的指针?

这两个指针链之间存在细微差别。

换句话说,我想要问的是char指向指针charchar **p显然可以指向*p,但是它是否也指向其他指针类型,如char *,它又指向void *

5 个答案:

答案 0 :(得分:2)

*p的类型始终为char *。它不能是恰好指向void*的{​​{1}}。

答案 1 :(得分:2)

指针类型派生自其他类型 - 对象类型,函数类型或不完整类型。从中派生指针的类型称为引用类型(C99,6.2.5.20)。

char**的引用类型为char*,这意味着解除引用char**表达式会产生char*

答案 2 :(得分:1)

指针包含一个地址。 C编译器使用诸如char之类的定义的char *pC;之类的变量类型来知道如何访问指针变量pC中包含的地址处的数据。因此对于C来说,所有地址都是相同的,至少对于所有主流计算机体系结构而言,该类型只是告诉C编译器在解除引用指针或取消引用变量指向的指针时要访问多少字节的内存。

所以像char **p;这样的定义告诉编译器变量p包含一个内存位置的地址,可以通过读取指向另一个地址的指针的字节数来访问它。 ,通过读取指针的字节数来访问,并且指向的地址包含char的地址。

请记住,使用C编程语言,您可以使用强制转换来说服编译器几乎接受任何内容。

根据定义,void *指针变量能够保存指向任何数据类型的指针。

然而,你所做的事实际上是有道理的。因此假设void *指针包含字符的地址;当char **p;中的变量char aChar = **p;被解除引用时,由程序员决定变量p包含有效地址以及地址所指向的内存位置{{1}包含有效地址。或者,如果您正在执行*p之类的操作,则char aStr[128]; strcpy (aStr, *p);指向的指针地址将包含零终止字符串的地址。

在某种程度上,它取决于C编译器。有些人比其他人更容易接受。有些会发出警告,有些可能会发出错误,而且可能还很大程度上取决于为编译选择的编译器选项。

使用Visual Studio 2017 Community Edition进行测试编译我可以执行以下操作:

*p

顺便说一句,最后一个定义char aStr[] = "this is a string"; void *p = aStr; // perfectly fine char *pc = aStr; // perfectly fine char **pp = &p; // warning C4133: 'initializing': incompatible types - from 'void **' to 'char **' char **pp2 = (char **)&p; // perfectly fine since we are casting the pointer char **pp3 = &aStr; // warning C4047: 'initializing': 'char **' differs in levels of indirection from 'char (*)[17]' 确实应该是一个错误,因为如果你取消引用char **pp3 = &aStr;,你就不会得到一个指向字符串的有效指针。

然而,使用调试器查看pp3,它指向一个指向字符串的有效指针,我可以看到pp的文本。

答案 3 :(得分:0)

在C编程语言中char **p将被描述为,p是指向char的指针。这意味着p可以保存另一个char指针的地址。

例如: -

char c = 'A';
char *b = &c;// here b is a char pointer so it can hold the address of a char variable which is c
char **p = &b;// p is a pointer of pointer to a char so here it can hold the address of a pointer of char i.e. b.

printf("%c", **p);// correct and will print A

现在这里p不是一个void指针,但你可以使p也是一个void *指针。所以下面也是正确的

void **p = &b;

但要获得char c的值,我们必须输入如下所示的

printf("%c", **p);// Not correct and will not print A

printf("%c", **((char **)p));//correct, first we type cast it to a pointer of pointer to char and dereference it to get the value stored in c

答案 4 :(得分:0)

如果您在声明中使用左右规则,您会看到:

  1. 你从标识符p(P)开始
  2. p在右边没有任何内容
  3. 你左转到第一个*指针(* P)
  4. 你再次左转,你看到*指针(** P)
  5. 然后你再次左转并看到char(char ** P)
  6. 总之,你可以得出结论:

    P是指向char的指针。

    这是一种奇特的方式,说P是指向char的双指针。