C中指针,变量和值的内存位置?

时间:2013-09-07 20:21:51

标签: c pointers

假设我在C中有以下代码:

int x = 1025;
int *y = &x;
  1. 什么是& y?它是指针变量y?
  2. 的内存地址
  3. 什么是指针变量y?它是否包含变量x的地址?
  4. 什么是& x?它是变量x本身的内存地址,还是地址的值1025?
  5. 变量x是什么?它是1025的价值地址吗?
  6. 什么是* y?是地址1025 =变量x?
  7. 和最重要的......

    如果打印& y显示y的地址,则打印& x显示x的地址,但打印x / * y只打印1025,如何打印1025的地址?

    很抱歉,如果其中一些问题看起来非常明显,但我有很多困惑,我正在努力清理指针。

    [编辑]伙计们,我发现了我的错误;我在想,变量x将保存代表1025的字节序列的地址。标准的Java到C的失调。谢谢大家的回复

6 个答案:

答案 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;,则*yy指向的变量中的值,当前为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)

  1. 什么是& y?它是指针变量y的内存地址吗?

    &y是存储变量y的内容的地址,这些内容是int的地址(指针)。

  2. 什么是指针变量y?它是否包含变量x的地址?

    是的,y是一个包含变量x地址的指针。

  3. 什么是& x?它是变量x本身的内存地址,还是地址的值,1025?

    &xx的地址,因此变量本身的内存地址,而不是您初始化它的常量值。

  4. 变量x是什么?这是它的价值地址,1025?

    变量本身只是内存中的存储区域,是C语言中的“对象”。在内部,编译器使用该名称来查找该存储区域的地址。

  5. 什么是* y?是地址1025 =变量x?

    *yy指向的值,在本例中为1025。

  6. 我如何打印1025的地址?

    由于各种原因(包括它可能没有地址),在C中使用文字常量的地址(字符串文字除外)是不合法的。

答案 4 :(得分:0)

是,是的,地址(这就是为什么&被称为“地址”运营商),不,不。

以下是你应该如何看待C中的变量。它们是你可以写出价值的纸片。 (值的类型应与纸张上指示的类型相匹配。)所有纸屑都在笔记本中绑定在一起,以便您可以通过页码来解决它们,我们称之为地址。

指针变量是您在其上编写页码的特殊纸张。您可以稍后检查指针,查看它指向的那张纸,然后再看一下。

由此得出:

  1. 变量有地址。这是一张带有页码的纸。
  2. 值没有地址。这不是一张纸,它就像一个数字,你可以在一张纸上写下。像1025这样的数字没有页码,但是当你在一个页面上写“1025”时,你会调用x,那么就会有一个带有页码的页面,上面写着1025页。
  3. 要说服自己无法获取值的地址,请尝试使用&1025之类的内容。编译器不允许这样做。

答案 5 :(得分:0)

  1. 准确。指针是变量,变量有自己的内存地址。

  2. 是的,指针y用变量x

  3. 的地址初始化
  4. & x是变量x的地址。如果您想清楚地看到差异,可以打印出来。

  5. 变量x保存在内存中的某个地址。这与变量初始化的值不同,在本例中为1025。

  6. 再次,要查看差异,请尝试打印出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