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是分开的存储位置。如果失败,一个非常简单的测试将确认它。Noa
并不意味着“地址X处的值”
b = 42;
if (a == 42) // true