1
int a = 10;    
int *p = &a; 

*p = 20;  /* Is this a valid statement? */

我明白,如果我这样做int *p;,然后如果我这样做*p = 10,它是无效的,因为我没有分配任何内存p。但是,我想知道初始化指向某个地址的指针是否会为该指针分配内存?

4

7 回答 7

6

我想知道初始化指向某个地址的指针是否会为其分配内存?

它不分配任何内存。因为pa指向已经分配的内存

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
于 2012-12-04T11:02:46.097 回答
5
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

于 2012-12-04T11:02:17.087 回答
4
int a = 10;    
int *p = &a; 

我想知道初始化指向某个地址的指针是否会为该指针分配内存?

不。aandp变量需要在堆栈上分配,或者如果它们在函数之外,它们将作为全局变量分配内存。编译器会自动为您执行此操作,即使您只是...

int a;    
int* p; 

...没有= <expression>指定它们的初始值。基本上发生的情况是,在内存中的某个地址,将保留一些字节(可能是 4 或 8 个)来存储您标识为的值a,而在另一个地址,将保留更多的内存(可能是 4 或 8 个字节)存储您调用的值p

pwith的初始化&a只是将 的数字地址复制a到内存中p...它不会导致任何 [1] 的分配,也不会移动它们的内存。

使用一些虚构的地址可能有助于像这样可视化它......

MEMORY-ADDRESS            CONTENTS           NAME
1000                      10                 a
2000                      1000               p

在这里,p“指向”是a因为p' 内存中的内容持有a' 的地址。但是 和 的地址ap由编译器选择的,与它们的值的任何初始化或其他更改无关。

我认为在这里让您感到困惑的是,我们在使用指针时确实经常分配内存......比如:

p = new int;

它的作用是在运行时动态地找到一些内存int,将该内存的地址加载到其中,p以便我们可以开始引用它p并使用它来存储int值。当我们完成它时,我们可以delete p将内存返回给系统,这样它就可以在另一个new完成时被回收和使用。这种类型的分配需要在您的代码中(或在您调用的某些库函数的代码中)显式执行。

[1] - 优化器可能选择不为a和/或p- 使用 CPU 寄存器分配实际内存,但这不会影响程序的功能行为(它可能会影响性能)。

于 2012-12-04T11:37:54.660 回答
3

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:

  • Take the address of an exiting variable: p = &a; or
  • Allocate some memory from the "heap": p = 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.

于 2012-12-04T12:06:52.957 回答
2

不,它不分配内存。您p实际上指向相同的位置,&a并且您修改了相同的内存*p = 20;。这不会崩溃,因为您引用了分配的内存(对于a)。如果它是你真正想要的,只取决于你。

于 2012-12-04T11:02:39.670 回答
1

但是,我想知道初始化指向某个地址的指针是否会为其分配内存?

“为它分配内存”是什么意思?当您创建一个指针时,您正在分配(静态)它的内存,或者换句话说,它需要保持存在的内存。

除此之外,还有指针指向的内存。当你说int a = 10你正在创建一个 int 并分配一个足够大的内存空间来容纳它时。
说然后p = &a意味着:“我的指针必须指向存储的内存地址a”。显然您已经分配了a,因此您可以安全地使用*p,但通常情况并非如此,您可能有一个未初始化的指针指向某个非法地址。

于 2012-12-04T11:10:06.607 回答
0

不,不需要。因为您的指针指向a变量的地址。因此,当您使用 时*p = 20, 的值a会发生变化。

所以,你的问题的答案是YES。:)

于 2012-12-04T11:04:12.867 回答