gpt4 book ai didi

c - C上的指针,需要简单验证

转载 作者:行者123 更新时间:2023-11-30 18:42:02 38 4
gpt4 key购买 nike

问题是 Reek 之前提到的手册的一部分。我有变量:

h under 1080 address with value 1020
i under 1020 address with value 1080.

在处理 hi 时,评估表达式 **h 的 L 值R 值 > 作为指向整数指针。我的答案是R:1020 L:1080,但讲师指南说:R:1080,L:1020。谁对谁错?

Step by step:
R-value first:
h=1020
*h=*(1020)=1080
**h=*(*h)=*(1080)=1020
L-value:
same, but value is address of value 1020, so 1080.

好的,这是应该可以工作的代码。如果它按计划工作,则证明本例中的 **h = h。

#include <stdio.h>

int main(void)
{
unsigned int * h;
unsigned int *i;
unsigned int ans=0;

h=&i;
i=&h;
printf("h=%u &h=%u i=%u &i=%u\n", h, &h, i, &i);

ans=*(unsigned int *)*h;
printf("**h=%u\n", ans);

*(unsigned int *)*h=1;

printf("h=%u &h=%u i=%u &i=%u\n", h, &h, i, &i);

return 0;

}

我得到的输出是:

h=3214580856 &h=3214580852 i=3214580852 &i=3214580856
**h=3214580856
h=1 &h=3214580852 i=3214580852 &i=3214580856

在最后一行我做了 **h=1;

最佳答案

addr | value
... | ...
1020 | 1080 <-- i
... | ...
1080 | 1020 <-- h

代码如下所示:

int* h;
int* i;
h = &i; // h pointing to the address of i (= 1020)
i = &h; // i pointing to the address of h (= 1080)

so **h 等于 *i,现在真正的问题是:“计算表达式的 R 值”是什么意思 *我? ...在这种情况下,左值和右值有什么区别?

MSDN's article on "L-Value and R-Value Expressions"状态:“如果标识符引用内存位置,则它是可修改的左值...如果 ptr 是指向存储区域的指针,则 *ptr 是一个可修改的左值,指定 ptr 指向的存储区域。” ~ 换句话说:如果将表达式 *i 视为左值,与直接使用h相同。 ~> h 的值 == 1020。

它还指出:“术语“r 值”有时用于描述表达式的值并将其与左值区分开来。所有左值都是右值,但并非所有 r 值-值是左值。” ~ 换句话说(我对这种情况的解释):如果您将 *i 视为右值,则不应将其视为变量 h 的别名,而是表达式本身的值。 ~> 解释为什么 *i 可以被视为 &h

关于c - C上的指针,需要简单验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18593543/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com