假设我在C中有以下代码:
int x = 1025;
int *y = &x;
和最重要的......
如果打印& y显示y的地址,则打印& x显示x的地址,但打印x / * y只打印1025,如何打印1025的地址?
很抱歉,如果其中一些问题看起来非常明显,但我有很多困惑,我正在努力清理指针。
[编辑]伙计们,我发现了我的错误;我在想,变量x将保存代表1025的字节序列的地址。标准的Java到C的失调。谢谢大家的回复
答案 0 :(得分:3)
假设:
int x = 1025; int *y = &x;
Q1。什么是
&y
?它是指针变量y
的内存地址吗?
是。它是变量y
的地址,类型为int **
。
Q2。什么是指针变量
y
?它是否包含变量x
的地址?
是。它是一个指针变量(在代码片段之后)保存x
的地址。
Q3。什么是
&x
?它是变量x
本身的内存地址,还是地址的值,1025?
它是变量x
的地址。碰巧x
目前持有1025,但当该值发生变化时,&x
仍然指向变量x
,因此指向x
的当前值不到1025(因为x
现在包含不同的值)。
Q4。什么是变量
x
?这是它的价值地址,1025?
变量x
是一个当前保存值1025的内存位置,但这可能会改变。诸如1025之类的值本身没有地址 - 这是来自OO语言的概念(我认为Smalltalk具有这种概念;我认为Java将它用于对象类型,但不是像int
这样的简单非对象类型‡)而不是C概念。
Q5。什么是
*y
?它是1025 =变量x
的地址吗?
这不是1025的地址;这是最简单的部分。如果您使用int i = *y;
,则*y
是y
指向的变量中的值,当前为x
,其值为1025,因此{{1}但是,如果您使用i
,则*y = 1024;
是*y
指向的变量,即y
,因此存储的值为x
x
(和*y
)从1025更改为1024。
Q6。如果打印
&y
显示y
的地址,则打印&x
会显示x
的地址,但打印x/*y
只会打印1025,我该如何打印地址1025?
前两个断言很好。 'but'断言需要写成x / *y
,/
和*
之间有空格,否则您已开始发表评论。但是,这不应该打印1025但应该打印1.如果你得到1025,那么你写了类似的东西:
printf("%d\n", x/*y); /* comment */);
本身没有1025的地址。对于当前保持值1025的各种变量,可能存在各种地址,但是值1025没有单个地址。这是非C概念,如上所述。
‡如果有人不同意Java或Smalltalk引用,请通过评论告诉我,我将删除错误的那些。它们不是我论证的关键部分 - 我只是想解释一些语言确实有一个与1025
'的地址松散相似的概念,即使C没有。
答案 1 :(得分:2)
什么是& y?它是指针变量y的内存地址吗?
是的。你也可以有指针指针。
int x = 357;
int *y = &x;
int **z = &y;
什么是指针变量y?它是否包含变量x的地址?
是。 基本上,它是一个整数ish类型(作为其值)保存'x'的地址。
什么是& x?它是变量x本身的内存地址,还是地址的值,1025?
变量的地址,带有整数,也是存储值的地方。
变量x是什么?这是它的价值地址,1025?
内存中有几个字节的位置,用于保存数据。如何解释数据取决于使用它的代码。对于整数,数据意味着代表一个数字(如1025),但它可以很容易地被操纵,就像它是其他东西,如几个字符或浮点数。内存中的数据仅仅是内存中的数据 - 它的含义就是如何使用它。
什么是* y?是地址1025 =变量x?
1025仅仅是存储在'x'地址的数据,存储在那些存储器字节中的值根本不会改变'x'的位置。一旦'x'被创建,它在内存中的位置(在其生命周期内)不会改变。
所以* y是x。 * y'取消引用'存储在'y'(x的地址)中的地址,然后你在'x'和'* y'所指的内存块上操作。
如果打印& y显示y的地址,打印& x显示x的地址,但打印x / * y只打印1025,我将如何打印1025的地址?
打印x / * y应打印1. x = 1025. *y = 1025. 1025/1025 = 1
1025没有地址。 1025是一些位在几个字节的位。 1025是存储在几个字节中的位序列(您的代码赋予其含义,但它本身没有意义),这些字节位于存储在“x”和“* y”中的地址。
如果我们假设一个整数是四个字节的内存(32位操作系统和硬件,假设),那么你在RAM中的一些随机位置有四个字节:
[01000100] [1101010] [00101001] [11010101] (gibbish binary for illustration)
存储在这四个字节中的二进制位并不意味着,直到您的代码决定如何解释这些位的含义。
'x' 这四个字节。 1025转换为二进制,存储在这四个字节中。 'x'的地址是这四个字节的地址。 'y'是一个字节块,用于存储'x'的地址。 '* y'允许你操作'y'存储地址的字节。访问* y给出了指向x所指的相同字节。
答案 2 :(得分:1)
什么是& y?它是指针变量y的内存地址吗?
是强>
什么是指针变量y?它是否包含变量x的地址?
是强>
什么是& x?它是变量x本身的内存地址,还是地址的值, 1025?
这是x的地址。 x可以更改,例如,如果您在后面的行中使用“x = 1024”进行设置,但其地址将保持不变
变量x是什么?这是它的价值地址,1025?
x是一个变量,这意味着它占用了内存中的一些空间,并且该空间中的位的整数值为1025.
什么是* y?是地址1025 =变量x?
* y取消引用指针,这意味着它获取该地址的内存值。所以它返回1025。
你的“大问题”只是问题#3。
答案 3 :(得分:1)
什么是& y?它是指针变量y的内存地址吗?
&y
是存储变量y
的内容的地址,这些内容是int
的地址(指针)。
什么是指针变量y?它是否包含变量x的地址?
是的,y
是一个包含变量x
地址的指针。
什么是& x?它是变量x本身的内存地址,还是地址的值,1025?
&x
是x
的地址,因此变量本身的内存地址,而不是您初始化它的常量值。
变量x是什么?这是它的价值地址,1025?
变量本身只是内存中的存储区域,是C语言中的“对象”。在内部,编译器使用该名称来查找该存储区域的地址。
什么是* y?是地址1025 =变量x?
*y
是y
指向的值,在本例中为1025。
我如何打印1025的地址?
由于各种原因(包括它可能没有地址),在C中使用文字常量的地址(字符串文字除外)是不合法的。
答案 4 :(得分:0)
是,是的,地址(这就是为什么&
被称为“地址”运营商),不,不。
以下是你应该如何看待C中的变量。它们是你可以写出价值的纸片。 (值的类型应与纸张上指示的类型相匹配。)所有纸屑都在笔记本中绑定在一起,以便您可以通过页码来解决它们,我们称之为地址。
指针变量是您在其上编写页码的特殊纸张。您可以稍后检查指针,查看它指向的那张纸,然后再看一下。
由此得出:
x
,那么就会有一个带有页码的页面,上面写着1025页。要说服自己无法获取值的地址,请尝试使用&1025
之类的内容。编译器不允许这样做。
答案 5 :(得分:0)
准确。指针是变量,变量有自己的内存地址。
是的,指针y用变量x
& x是变量x的地址。如果您想清楚地看到差异,可以打印出来。
变量x保存在内存中的某个地址。这与变量初始化的值不同,在本例中为1025。
再次,要查看差异,请尝试打印出x的地址及其值:
int x = 1025;
printf("%p", &x); //prints the address of x
printf("%d", x); //prints the value assigned to x
最后一个问题:* y是变量指针和解除引用运算符*,这意味着您可以获得y指向的变量中保存的值。
实际上,如果你打印x /(* y)那么你应该得到1因为你有1025/1025