如何评估c中的双指针?

How to evaluate double pointers in c?

我是学c的,对这道双指针题比较迷茫。

int x = 44;
int *p = &x;
int **t = &p;

bool a = (*t = &x);

我要判断a会不会是true or false,正确答案是true。我的想法是t指向p的地址,p指向x的地址。我知道如果你放**t,它应该指向x的地址,但我想如果你只放*t它应该指向p的地址。谁能解释一下?

会是true。解释如下:

bool a = (*t = &x); 中,变量 t 保存 p 的地址。您正在取消引用 t*t 将指向存储在 p.

位置的内容

地址p中存储的内容是地址x。记住*p = &x。比较 *t == &x 则为真。

在你提到的问题*t = &x中,如果那是原始代码它仍然是正确的,因为(*t = &x); returns中的赋值是一个非空指针。当该非空指针转换为布尔值时,它变为 true.

第一行声明了一个 'x' 类型的变量 'int',并将数字文字值 44 赋给该变量。

int x = 44;

下一行(2)声明了一个类型为'pointer to int'的变量'p',并为表达式'&x'赋值(即x的地址,指向int的指针) ,

int *p = &x;

下一行 (3) 声明了一个类型为 'pointer to, pointer to int' 的变量 't'(一个包含指向 int 类型的指针的指针),并赋值给表达式 '&p'(这是p 的地址,指向 int 的指针,

int **t = &p;

变量t是一个'doubly-indirected pointer'。 现在 'tricky part'.

下一行 (4) 声明了一个变量 'a',它是一个 bool(ean) 变量 (true/false),并在 rhs(右侧, '(*t = &x)'。括号是为了确保遵守预期的优先顺序。所以我们计算表达式 '*t = &x'。

bool a = (*t = &x);

这里是'tricky'部分,提供的代码有赋值'='运算符!如果这是比较,那么'=='运算符会出现.所以这条语句获取x的地址(指向int的指针),并将其存储到*t(t指向的位置,并且该位置是指向int的指针)。

进行此比较时,表达式将比较相同的值,结果为真。但这是任务。和一个赋值表达式 returns 分配的值,它是 x 的地址(指向 x 的指针)。在大多数系统上,该指针是内存中的一个位置(如果变量存储在零地址,则该指针只能为零(NULL))。

表达式的类型为 'pointer to int',但被转换(转换)为 bool 类型。由于 C 认为 false=0 和 true 任何不等于 0 的值,该值从(可能不是 NULL)指向 int 的指针转换为 bool (true)。

如果括号被省略,那么赋值仍然会发生(赋值运算符的评估顺序是从右到左),但随后会发生强制转换。但是去掉括号,编译它,看看你的编译器说什么。

你说:

我需要判断a是真还是假,正确答案是真。我的想法是t指向p的地址,p指向x的地址。 我知道如果你放**t,它应该指向x的地址,但我想如果你只放*t 它应该指向p的地址。谁能解释一下?

这是我的尝试和解释:

粗体 部分是您感到困惑的地方。 **t == x == *p, and *t == &x == p.

**t 引用存储在 x 的地址中的值,而不是地址本身。

*t =p 引用 x 的地址,取消引用其中任何一个都会得到 x 的值。

这个解释清楚了吗?如果有帮助,我可以扩展或制作示例程序。

示例临时代码将打印这些值以获得清晰度:

int x = 42;   //&x = 0x1234DEAD (or some other address, just picked one for an example)
int * p = &x; // p = 0x1234DEAD and &p = 0x5678BEEF  (agian an example address)
int **t = &p; // t = 0x5678BEEF

printf("%d and %d and %d\n",**t, *p, x); //should be 42;
printf("%p and %p\n",*t, p); //should be 0x1234DEAD;
printf("%p\n",t); //should be 0x5678BEEF;
int x = 44;

声明整型变量x,存储值44。

int *p = &x;

声明整数指针变量 p,p 现在存储 x 的地址。

int **t = &p;

声明指向名为t的int类型指针的指针,t存储p的地址。 (指针也有地址)

bool a = (*t = &x);

在 C 中;

'*' = 从地址中提取值(取消引用)

'&' = 给出变量地址(参考)

因为 t 是指向存储在 p 中的值的指针。 *t将是p中存储的值,即x的地址。 (我们在第二行解决了这个问题)

另一方面,由于 & 用于变量 x。这将提取 x 的地址。

因此*t == &x,将布尔值a设置为真。

My thoughts were that t points to the address of p

是的。

and p points to the address of x

是的。

I know if you put **t, it should point to the address of x

没有,**t x.

but I thought if you just put *t it should point to the address of p.

不是,*t p.

解引用运算符 "gives you" 指向的东西。因此,由于 p 也是 &x(因为这是您设置的),*t == &x.

虽然没有实际意义,因为您实际上并没有与 == 进行比较,您使用 = 进行赋值,因此您的表达式求值为该赋值的结果,即 &x,这是一个非 NULL 指针,所以整个事情是 "true-like"。 (只有空指针转换为 false)。

I know if you put **t, it should point to the address of x, but I thought if you just put *t it should point to the address of p.

嗯,这既对又错。 "point to the address of" 应该读作 "designate" 是正确的。


首先,你声明了3个变量

int x = 42;
int *p = &x;
int **t = &p;

现在这可以读作 x is an int, *p is一个 int**t 一个 int。然后我们将x初始化为值42,然后p初始化为x的地址,t初始化为x的地址p.

给定

int *p = &x;

L-value expressionsx*p这两个不仅都是int类型,而且值相同;他们指定相同对象。就像 10565305 和 Amy Finck 指定同一个用户一样。这也称为 aliasing - *p 别名 x,就像 Amy Fink 和用户 10565305 是您在 Stack Overflow 上的别名(以及名称 x不是对象本身,就像你是一个人,而不是一个名字。

int **t = &p一样,我们现在注意到,就像上面一样,*tp指定了相同的对象p.而p的当前值是表达式&x的当前值。因此 *t == &x 必须为真。

至于*t的类型,如果**t是一个int,那么*t一定是int *(恒星守恒定律在指针 ;) 这当然匹配 p 的类型和 &x.

的类型