2012-12-04 43 views
1
int a = 10;  
int *p = &a; 

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

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

+0

您已将内存分配给'p'。 –

+0

内存是'a',现在它的值是'20'。 –

+0

请考虑重写最后一句,并将* it *替换为它应该引用的内容。目前,“某地址”和“指针”之间存在混淆。这就是为什么你得到“是”和“否”的答案。 – dasblinkenlight

回答

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指向的内存地址。 所以在你区分它是有效的,因为&a是有效的内存位置和p开始指向该变量的时候我们做p= &a这就是所谓的Undefined bahavior

因此*p = 20意味着实际上使用指针p更改或分配值a

2

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

6

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

它不分配任何内存。由于p一个指向一个已分配的内存

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 
+1

好吧,所以我只是修改标记为'a'的内存位置。 – user1624400

+0

@ user1624400对。它的内存相同。我用更多细节更新了答案 –

0

不,没有必要的。因为你的指针指向a变量的地址。所以,当你使用*p = 20时,a的值将会改变。

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

1

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

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

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

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

我在想,如果初始化一个指向某个地址分配内存给指针或不是?

号的ap变量需要栈上分配,或者如果他们的功能之外,他们会被分配的内存为全局变量。编译器将自动为您完成此,即使你只是有...

int a;  
int* p; 

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

p&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寄存器代替,但不会影响程序的功能行为(可能会影响性能)。

3

A 指针只是一个号码。它有一个特殊的类型来确保它可以代表正确的数字范围,并有助于程序的理解,但基本上它只是一个数字。

number代表内存地址。你不能只做这些:你需要从某个地方得到一个有意义的地址。

您可以:

  • 采取退出的变量的地址:p = &a;或
  • 从“堆”分配一些内存:p = malloc(size)

就是这样,一旦你有一些内存的地址,你就大功告成了!您现在可以使用解除引用指针在您喜欢的任何位置使用*运算符:*p = somedata

+0

说一个指针只是一个数字是不准确的。在许多实现中,指针只是一个数字。但是,指针也可能有其他形式。例如,它可能是一对数字或地址和存储在该地址的一些附加信息的组合。 –

+0

@EricPostpischil:非常真实,我自己实现了FDPIC系统,但我们不要不必要地使事情复杂化。即使在这些情况下,扩展指针可以被看作是一个“数字”,尽管解释更复杂。 FDPIC改变了函数指针的形式,但没有修改数据指针。 – ams

相关问题