理解C中的指针和地址引用

时间:2014-10-30 03:33:35

标签: c

所以这是一个练习,下面给出解决方案:

假设已经做出以下声明:

char c = ‘A’;
char *p = &c;
char **p2 = &p;
void *v = &p2;

检查以下每个表达式。如果表达式是非法的,请写入ILLEGAL。如果表达式是合法的,请写出它的类型(即int,void *等)

 &p2 : char***
 *p2: char*
 &v: char****
 p2 + 1: char**
 v[0]: Illegal

你能解释我们是怎么得到这种类型的吗?我知道v [0]是非法的,因为v指向地址,我们不能像使用数组一样使用括号表示法来访问它。 但所有其他让我有点困惑,特别是1-3。

我很乐意帮助你!

2 个答案:

答案 0 :(得分:3)

对于e类型的任何左值表达式T,表达式&e的类型为T *,表达式的值为e的位置。同样,对于类型为p的任何表达式T *,表达式*p的类型为T,而表达式的值为p指向的值{

表达式c的类型为char,因此表达式&c的类型为char *,表达式的值为c的位置。此值已分配给变量p,该变量也具有类型char *

由于p的类型为char *,因此表达式&p的类型为char **,值为p的位置。这已分配给变量p2,该变量也具有类型char **

答案键有误; &v的类型  是void **,而不是char ****

v[0]是非法的,因为v的类型为void *,并且不允许取消引用无效指针。

答案 1 :(得分:0)

从基本变量开始

c: char
p: char* (because p = &c)
p2: char** (because p2 = &p)
v: char*** (because v = &p2)

现在,&添加了一个间接级别,以及*个解除引用,它们减去了一个间接级别。

&p2: char*** (because p2 is char**)
*p2: char* (because p2 is char**)
&v: char**** (because v is char***)
p2 + 1: char** (same type as p2)

请注意,您可以(以及某些人)将char *p写为char* p,这可以更轻松地翻译为“p类型的变量char*”,同样适用于char** p {1}}等等,但char *p已成为惯例。当我加入一家遵循char *p惯例的公司时,我个人很难转换。