[英]Understanding pointers and address references in 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。
我很乐意提供帮助!
对于任何类型T
左值表达式e
,表达式&e
具有类型T *
,并且表达式的值是e
的位置。 类似地,对于类型T *
任何表达式p
,表达式*p
具有类型T
并且表达式的值是p
指向的任何值。
表达式c
类型为char
,因此表达式&c
类型为char *
,表达式的值是c
的位置。 此值分配给变量p
,其类型也为char *
由于p
具有char *
类型,因此表达式&p
具有char **
类型,其值是p
的位置。 这被分配给变量p2
,其类型也为char **
。
答案键有误; &v
的类型是void **
,不是char ****
。
v[0]
是非法的,因为v
类型为void *
,并且不允许您取消引用void指针。
从基本变量开始
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
,可以更轻松地将其翻译为“ char*
类型的变量p
”,与char** p
相同, char** p
。但是char *p
在某种程度上已成为惯例。 当我加入遵循char *p
约定的公司时,我个人很难转换。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.