int a = 10;
int *p = &a;
*p = 20; /* Is this a valid statement? */
我明白,如果我这样做int *p;
,然后如果我这样做*p = 10
,它是无效的,因为我没有分配任何内存p
。但是,我想知道初始化指向某个地址的指针是否会为该指针分配内存?
int a = 10;
int *p = &a;
*p = 20; /* Is this a valid statement? */
我明白,如果我这样做int *p;
,然后如果我这样做*p = 10
,它是无效的,因为我没有分配任何内存p
。但是,我想知道初始化指向某个地址的指针是否会为该指针分配内存?
我想知道初始化指向某个地址的指针是否会为其分配内存?
它不分配任何内存。因为p
a指向已经分配的内存
int a = 10; // a is statically allocated and value 10 is assigned.
int *p = &a; // p is pointed to address of a.
*p = 20; // at this point p points to that statically allocated memory
int a = 10;
int *p = &a;
*p = 20; /* Is this a valid statement? */
答案就YES
在这种特殊情况下。
但是当你这样做时:
int *ptr; //declaration of pointer variable
*ptr = 20; // It means you are assigning value 20 to the variable where `ptr` points to.
但实际上ptr
并不是指向任何地方,基本上它意味着它有indeterminate value
。
这样做*ptr = 20
会将值 20 放入 . 指向的内存地址ptr
。所以它被称为Undefined bahavior
在您的情况下,它是有效的,因为它&a
是有效的内存位置,并且p
在我们这样做时开始指向该变量p= &a
。
so*p = 20
意味着实际更改或分配a
使用指针的值p
。
int a = 10;
int *p = &a;
我想知道初始化指向某个地址的指针是否会为该指针分配内存?
不。a
andp
变量需要在堆栈上分配,或者如果它们在函数之外,它们将作为全局变量分配内存。编译器会自动为您执行此操作,即使您只是...
int a;
int* p;
...没有= <expression>
指定它们的初始值。基本上发生的情况是,在内存中的某个地址,将保留一些字节(可能是 4 或 8 个)来存储您标识为的值a
,而在另一个地址,将保留更多的内存(可能是 4 或 8 个字节)存储您调用的值p
。
p
with的初始化&a
只是将 的数字地址复制a
到内存中p
...它不会导致任何 [1] 的分配,也不会移动它们的内存。
使用一些虚构的地址可能有助于像这样可视化它......
MEMORY-ADDRESS CONTENTS NAME
1000 10 a
2000 1000 p
在这里,p
“指向”是a
因为p
' 内存中的内容持有a
' 的地址。但是 和 的地址a
是p
由编译器选择的,与它们的值的任何初始化或其他更改无关。
我认为在这里让您感到困惑的是,我们在使用指针时确实经常分配内存......比如:
p = new int;
它的作用是在运行时动态地找到一些内存int
,将该内存的地址加载到其中,p
以便我们可以开始引用它p
并使用它来存储int
值。当我们完成它时,我们可以delete p
将内存返回给系统,这样它就可以在另一个new
完成时被回收和使用。这种类型的分配需要在您的代码中(或在您调用的某些库函数的代码中)显式执行。
[1] - 优化器可能选择不为a
和/或p
- 使用 CPU 寄存器分配实际内存,但这不会影响程序的功能行为(它可能会影响性能)。
A pointer is just a number. It has a special type to make sure it can represent the right range of numbers, and to aid program understanding, but basically it's just a number.
The number represents a memory address. You can't just make those up: you need to get a meaningful address from somewhere.
You can:
p = &a
; orp = malloc(size)
That's it, once you have the address of some memory, you're done! You can now dereference the pointer using the *
operator anywhere you like: *p = somedata
.
不,它不分配内存。您p
实际上指向相同的位置,&a
并且您修改了相同的内存*p = 20;
。这不会崩溃,因为您引用了分配的内存(对于a
)。如果它是你真正想要的,只取决于你。
但是,我想知道初始化指向某个地址的指针是否会为其分配内存?
“为它分配内存”是什么意思?当您创建一个指针时,您正在分配(静态)它的内存,或者换句话说,它需要保持存在的内存。
除此之外,还有指针指向的内存。当你说int a = 10
你正在创建一个 int 并分配一个足够大的内存空间来容纳它时。
说然后p = &a
意味着:“我的指针必须指向存储的内存地址a
”。显然您已经分配了a
,因此您可以安全地使用*p
,但通常情况并非如此,您可能有一个未初始化的指针指向某个非法地址。
不,不需要。因为您的指针指向a
变量的地址。因此,当您使用 时*p = 20
, 的值a
会发生变化。
所以,你的问题的答案是YES
。:)