当我们更改指针的内容时指针指向何处?

时间:2018-07-22 05:25:49

标签: c

例如,当我们声明指针时

  

字符* p;

然后我们

  

* p ='a';

那么 p

的值是什么

我的意思是 p 指向哪里?

是否在任意存储位置中写了'a',然后指针(即 p )指向该存储位置?

P.S。 -对不起,因为我的英语还没到那个标准。欢迎进行修改:)

2 个答案:

答案 0 :(得分:2)

我建议您在这里研究此article,以便更好地理解指针的概念。

我将使用int深入研究第一个示例:

我们有

int foo;

然后我们声明

int *foo_ptr = &foo;

就像上面的char示例一样。

foo_ptr被声明为指向int的指针。 我们已初始化为指向foo 。.

现在,将每个变量都视为一个框。 foo是一个大小为sizeof(int)个字节的框。此框的位置是其地址。访问地址时,实际上是访问它所指向的框的内容。

当您声明:

char *p;

然后:

*p = 'a';

您没有指向地址,*p是内存中的定义点,表示静态分配,它是内存的只读部分。 由于上述原因,任何尝试更改*p的行为都会导致不确定的行为

答案 1 :(得分:2)

赋值*p = 'a'将一个值放置在p所指向的位置,但不会将值赋给指针p

使用*p = 'a'时,指针p必须已经有一个值。通过使用malloc分配空间或通过设置p指向要更改的现有对象(例如p = &x),您可以为程序员分配值。 x的定义较早。

如果您使用*p = 'a'之前未将行为分配给p,则该行为不是C标准定义的。常见的结果包括:

  • 代码的作用就好像p具有有效的随机值一样,可能是先前在创建新p的存储器中工作遗留下来的一些位的值。然后*p = 'a'可能会将'a'写到一个意想不到的地方,这可能会导致您的程序以各种方式发生故障。否则p可能指向未分配的内存,而*p = 'a'会导致程序崩溃。
  • 在优化过程中,当执行p时,在某些或所有情况下,编译器可能会认识到*p = 'a'未初始化。由于现代优化器的构造,在适用情况下,这可能会导致编译器消除出现*p = 'a'的整个代码路径。这可能会导致程序的整个部分消失。