如何评估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
一样,我们现在注意到,就像上面一样,*t
和p
指定了相同的对象,p
.而p
的当前值是表达式&x
的当前值。因此 *t == &x
必须为真。
至于*t
的类型,如果**t
是一个int
,那么*t
一定是int *
(恒星守恒定律在指针 ;) 这当然匹配 p
的类型和 &x
.
的类型
我是学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 ofx
, but I thought if you just put*t
it should point to the address ofp
.
嗯,这既对又错。 "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
一样,我们现在注意到,就像上面一样,*t
和p
指定了相同的对象,p
.而p
的当前值是表达式&x
的当前值。因此 *t == &x
必须为真。
至于*t
的类型,如果**t
是一个int
,那么*t
一定是int *
(恒星守恒定律在指针 ;) 这当然匹配 p
的类型和 &x
.