考虑这个例子。
#include <stdio.h>
int main() {
int a = 5;
int b = a;
return 0;
}
有人在上面的代码中告诉我,首先创建一个整数的内存块并赋值为5,然后 a 指向该块。然后, b 也指向包含值5的同一块内存。
所以我的问题是,如果 a 是一个整数变量,它还指向某个东西,那么它与指针有什么不同?
如果这个问题太基础,请原谅我。但我需要知道。
答案 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的框中:
对于您创建的所有变量,使用变量名称创建一个新框以保存该值。
将一个变量分配给另一个变量会复制该值并将该值放入新框中。
a = 2;
int b = a;
因此,a
和b
不是指针,而是具有自己地址的不同内存块的名称。
答案 2 :(得分:3)
您可能正在考虑的是(如果这是在C ++环境中):
int a = 5;
int& b = a;
这会创建一个引用到a
,它绑定到a
的内存。
现在更改b
会改变a
:
b = 42;
if (a == 42) // true
在您的OP中,自b
以来不存在独立于a
的变量。
答案 3 :(得分:1)
在上面的代码中,a
和b
是位于各自内存块中的单独变量。
这一行:
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;让人想到指针,这是一个完全不同的运行时概念。