所以这是一个练习,下面给出解决方案:
假设已经做出以下声明:
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。
我很乐意帮助你!
答案 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
惯例的公司时,我个人很难转换。