繁体   English   中英

了解C语言中的指针和地址引用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM