如何评估C中的双指针?

时间:2018-10-26 22:20:00

标签: c pointers boolean pointer-to-pointer

我正在学习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的地址。谁能解释?

6 个答案:

答案 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; xint *p和{ {1}} int。然后,我们将**t初始化为值int,然后将x初始化为42 的地址,然后将p初始化为{{1 }}。

给出

x

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

*p类似,我们现在注意到xx与上面一样,指定相同对象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)。