C++ 变量名和指针之间有什么区别?

C++ 变量名和指针之间有什么区别?,c++,c,variables,pointers,C++,C,Variables,Pointers,考虑这个例子 #include <stdio.h> int main() { int a = 5; int b = a; return 0; } #包括 int main(){ INTA=5; int b=a; 返回0; } 有人在上面的代码中告诉我,首先为integer创建一个内存块并赋值5,然后a指向该块。然后,b也指向包含值5的同一内存块 所以我的问题是,如果a是一个整数变量,它也指向某个东西,那么它与指针有什么区别 如果这个问题太基本,请原谅。但

考虑这个例子

#include <stdio.h>

int main() {
    int a = 5;
    int b = a;
    return 0;
}
#包括
int main(){
INTA=5;
int b=a;
返回0;
}
有人在上面的代码中告诉我,首先为integer创建一个内存块并赋值5,然后a指向该块。然后,b也指向包含值5的同一内存块

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


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

在这种情况下,向您解释这一点的人是错误的:

#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;
}
就您而言,您有:

memory addresses:         variable name           value stored at memory address
1000                      a(int)                    5
1004                      b(int)                    5
显然,改变a和的值不会相互影响

在我描述的案例中,您有:

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


这样做
*b=3将更改上述代码中
a

的值,
a
b
是各自内存块中的独立变量

这一行:

int a = 5;
int b = a;
创建名为
a
的变量,并将其初始值设置为
5

这一行:

int a = 5;
int b = a;
创建了一个名为
b
的变量,并将
a
的当前值作为初始值,在本例中为
5

如果以后要添加行
a=4
a
将包含值
4
,而
b
在声明时仍将包含值
5

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

您可以将其视为将指定的值放入一个框中,变量名如下:

对于您创建的所有变量,将使用变量名创建一个新框来保存值

将一个变量赋值给另一个变量会复制该值,并将该值放入新框中

a = 2;
int b = a;

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

有人能解释一下上面代码的内存中到底发生了什么吗

我会编一些地址——假设a在1000,b在1004


首先,内存区域中存在上次使用的剩余值。这可能是任何事情:

Address     Value
  ...
  1000      1234
  1004      5678
  ...
然后
inta=5
将为
a
保留的空间设置为5

Address     Value
  ...
  1000      5
  1004      5678
  ...
然后
intb=a将其复制到为
b
保留的空间:

Address     Value
  ...
  1000      5
  1004      5
  ...
在任何情况下都不涉及变量名

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

在:

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

在:

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

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

这些变量都不是指针。但是,与C中的每个变量一样,它们都有通过运算符
获得的地址
&a
是容器
a
的地址

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

int *p = &a;

p
是一个包含
a
地址的容器,我们简短地说
p
指向
a
。当然,<>代码> p>代码>也有一个地址(每个变量/容器):<代码>和p>代码>

你可能会想到的是(如果这是在C++上下文中):

这将创建对
a
的引用,该引用绑定到
a
的内存

更改
b
现在更改
a

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

在您的OP中,情况并非如此,因为
b
有一个独立于
a

的独立变量,您混淆了编译时和运行时的概念

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


我们通常说“指代”而不是“指向”,尽管这些词的英文意思几乎相同,因为“指向”让人想到指针,这是一个完全不同的运行时概念。

指针是一个存储其他数据的内存地址的变量。这就是全部。就这样。指针是一个具有非常特定用法的变量。上面两个变量都不是指针。内存被分配用来存储<代码> 5代码/>代码,但这不是指针。不要把字母A与一个变量称为“A”混淆。更好的短语可能是“A是内存块的名字”。请阅读一些C和C++书籍(也许是汇编书)。大多数书都会明确a和b是分开的存储位置。如果失败,一个非常简单的测试将确认它。No
a
并不意味着“地址X处的值”
b = 42;
if (a == 42) // true