例如,当我们声明指针时
字符* p;
然后我们
* p ='a';
那么 p
的值是什么我的意思是 p 指向哪里?
是否在任意存储位置中写了'a',然后指针(即 p )指向该存储位置?
P.S。 -对不起,因为我的英语还没到那个标准。欢迎进行修改:)
答案 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'
的整个代码路径。这可能会导致程序的整个部分消失。