我正在学习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
的地址。谁能解释?
答案 0 :(得分:2)
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设置为true。
答案 1 :(得分:1)
我知道您是否放置
**t
,它应该指向x
的地址,但我想,如果您只是放置*t
,它应该指向{{1} }。
嗯,对与错。 “指向……的地址”应显示为“ designate”,这是正确的。
首先,您声明了3个变量
p
现在,这可以理解为int x = 42;
int *p = &x;
int **t = &p;
是是x
,int
是是*p
和{ {1}} 是int
。然后,我们将**t
初始化为值int
,然后将x
初始化为42
的地址,然后将p
初始化为{{1 }}。
给出
x
这两个L-value expressions t
和p
不仅都是int *p = &x;
类型,而且具有相同的值;他们指定 相同对象。就像10565305和Amy Finck指定相同的用户一样。这也称为 aliasing -x
别名*p
,就像Amy Fink和User 10565305是您在Stack Overflow上的别名(名称int
不是别名对象本身,就像您是一个人,而不是名字一样。)
与*p
类似,我们现在注意到x
和x
与上面一样,指定相同对象,int **t = &p
。 *t
的当前值是表达式p
的值。因此p
必须为真。
对于p
的类型,如果&x
是*t == &x
,则*t
必须是**t
(指针中恒星的守恒定律; )当然与int
的类型和*t
的类型匹配。
答案 2 :(得分:0)
它将是true
。这是解释:
在bool a = (*t = &x);
中,变量t
的地址为p
。您正在取消引用t
,即*t
将指向存储在p
位置的内容。
存储在地址p
中的内容是地址x
。记住*p = &x
。比较*t == &x
将成立。
在您提到的*t = &x
问题中,如果这仍然是原始代码,那么它仍然是正确的,因为(*t = &x);
中的赋值将返回非null指针。当该非空指针转换为布尔值时,它将变为true
。
答案 3 :(得分:0)
第一行声明类型为'int'的变量'x',并将数字文字值44分配给该变量。
int x = 44;
下一行(2)声明类型为'int的指针'的变量'p',并分配表达式'&x'的值(它是x的地址,它是int的指针),
int *p = &x;
下一行(3)声明类型为'pointer to,int'的指针(包含指向int类型的指针的指针)的变量't',并分配表达式'&p'(即地址) p,它是指向int的指针,
int **t = &p;
变量t是一个“双重间接指针”。 现在是“棘手的部分”。
下一行(4)声明一个变量'a',它是一个bool(ean)变量(true / false),并在rhs上分配表达式的值(右侧,'(** =&x )“。为了确保遵守预期的优先顺序,在这里加上了括号,因此我们对表达式'* t =&x'进行了评估。
bool a = (*t = &x);
这是“棘手”的部分,提供的代码中有一个赋值“ =”运算符!如果是比较,则将出现“ ==”运算符。因此,该语句将x的地址(指向int的指针)存储到* t(t指向的位置,该位置是指向int的指针)。
如果进行此比较,则表达式将比较相同的值,并且为true。但这是任务。赋值表达式返回分配的值,即x的地址(指向x的指针)。在大多数系统上,该指针是内存中的一个位置(如果变量存储在零地址处,则只能为零(NULL))。
该表达式的类型为“ pointer to int”,但被转换(转换)为bool类型。由于C认为false = 0和true都不等于0,因此该值从(可能不是NULL)指针转换为int转换为bool(true)。
如果省略了括号,则仍会发生赋值(赋值运算符的评估顺序为从右到左),但随后将进行强制转换。但是删除括号,对其进行编译,然后查看编译器的内容。
答案 4 :(得分:0)
您说:
我需要说出a是对还是错,正确答案是对。我的想法是t指向p的地址,p指向x的地址。 我知道您是否放置** t,它应该指向x的地址,但是我想,如果您只放置* t ,它应该指向p的地址。谁能解释?
这是我的尝试并做一个解释:
粗体部分是您感到困惑的地方。 ** t == x == * p和* 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;
答案 5 :(得分:0)
我的想法是t指向p的地址
是的
p指向x的地址
是的
我知道如果您输入** t,它应该指向x的地址
否,**t
是 x
。
但是我想如果您只输入* t,它应该指向p的地址。
否,*t
是 p
。
解引用运算符“给您”所指向的内容。因此,由于p
也是&x
(因为这就是您设置的内容),*t == &x
。
这很重要,因为您实际上没有与==
比较,而是分配了=
,因此您的表达式的计算结果是该赋值的结果,即&x
,即一个非NULL的指针,所以整个事情都是“真实的”。 (只有空指针会转换为false
)。