变量名和指针有什么区别?

时间:2016-02-03 19:45:25

标签: c++ c variables pointers

考虑这个例子。

#include <stdio.h>

int main() {
    int a = 5;
    int b = a;
    return 0;
}

有人在上面的代码中告诉我,首先创建一个整数的内存块并赋值为5,然后 a 指向该块。然后, b 也指向包含值5的同一块内存。

所以我的问题是,如果 a 是一个整数变量,它还指向某个东西,那么它与指针有什么不同?

如果这个问题太基础,请原谅我。但我需要知道。

7 个答案:

答案 0 :(得分:5)

在这种情况下,无论谁向你解释这个都是错的:

mask

#include <stdio.h> int main() { int a = 5; //variable a has value 5 put it //a does have an address int b = a; //variable b is created, it has its own seperate memory address. //in this case the CONTENTS of a (5) are dumped inside b return 0; } 不会使彼此的变量别名。

你听到的是:

int b=a;

在你的情况下你有:

//...
int a=1;
int *b = &a; //create a pointer called b and make it point to a 
//(set it equal to address of a)

明显改变a的值并且不会相互影响

在我描述的情况下你有这个:

memory addresses:         variable name           value stored at memory address
1000                      a(int)                    5
1004                      b(int)                    5

如您所见,由于memory addresses: variable name value stored at memory address 1000 a(int) 5 1004 b(int*) 1000 是指针,因此其实际值是a的地址。

这样b会更改*b=3;

的值

答案 1 :(得分:3)

宣布

int a = 1;

编译器为sizeof(int)字节分配内存并命名该数据位置(或内存块)a并在该块中放置值1。 以非常简单的方式,变量是数据的命名位置。

您可以将其视为将值分配在下面带有变量名称为shown的框中:
enter image description here

对于您创建的所有变量,使用变量名称创建一个新框以保存该值。

将一个变量分配给另一个变量会复制该值并将该值放入新框中。

a = 2;
int b = a;

enter image description here enter image description here

因此,ab不是指针,而是具有自己地址的不同内存块的名称。

答案 2 :(得分:3)

您可能正在考虑的是(如果这是在C ++环境中):

int a = 5;
int& b = a;

这会创建一个引用a,它绑定到a的内存。

现在更改b会改变a

b = 42;
if (a == 42) // true

在您的OP中,自b以来不存在独立于a的变量。

答案 3 :(得分:1)

在上面的代码中,ab是位于各自内存块中的单独变量。

这一行:

int a = 5;

创建一个名为a的变量,并为其提供初始值5

这一行:

int b = a;

创建一个名为b的变量,并为其指定a当前值的初始值,在本例中为5

如果您稍后添加第a=4行,a将包含值4,而b仍将包含值5

答案 4 :(得分:1)

  

有人可以解释一下上面代码在内存中实际发生了什么吗?

我会填写一些地址 - 让我们说a是1000,b是1004.

首先,从最后一次使用该内存区域开始,有剩余的值。这可能是任何事情:

Address     Value
  ...
  1000      1234
  1004      5678
  ...

然后int a = 5;将为a保留的空间设置为5。

Address     Value
  ...
  1000      5
  1004      5678
  ...

然后int b = a;将其复制到为b保留的空间:

Address     Value
  ...
  1000      5
  1004      5
  ...

实际上并没有涉及变量名称。

变量名仅由编译器使用。在这种情况下,编译器知道&#34; a&#34;表示&#34;地址1000和#34;那&#34; b&#34;表示&#34;地址1004&#34;的值。 (这有点过于简单,因为局部变量并不总是存储在同一个地址,但你明白了这一点)

答案 5 :(得分:1)

在:

int a = 5;

a表示存储5的容器。 a只是表示内存位置或其内容的标识符。在a=5中,a表示容器,在5+a中,a表示包含的值。

在:

int b = a;

b表示存储容器a的当前值的容器。

然后你有2个容器,一个表示a,另一个表示b。两者都包含一个值(两者都相同)。

这些变量都不是指针。但是,作为C中的每个变量,它们具有使用运算符&获得的地址。 &a是容器a的地址。

指针是一个变量(如果你愿意的话,是一个容器),它的值是某个容器的地址。因此:

int *p = &a;

p是一个包含a地址的容器,我们很快就会说p指向a。当然p也有一个地址(作为每个变量/容器):&p

答案 6 :(得分:0)

您对编译时和运行时概念感到困惑。

C程序中的名称是编译时实体,它引用将在运行时使用的存储。一旦编译器完成其工作,并且您有目标代码,名称就会消失(调试信息除外,它不是运行时对象代码的一部分 - 它是调试器引用的额外信息),以及您的目标代码直接对寄存器或内存中的值进行操作(&#39;存储&#39;我在上面提到过)。

我们通常说&#34;指&#34;而不是&#34;指向&#34;即使这些词的英语含义几乎相同,因为&#34;指向&#34;让人想到指针,这是一个完全不同的运行时概念。