根据多个源,指针 可以为指针分配如下值: 如果我们指定一个指针,它的值如下: 60被分配给 但是,对于以下代码: 收到以下输出: p是90 p是100 即表达式 怎么样?????? p
在取消引用时指向一个值。因此,我们可以说指针包含地址作为其值,并且当使用解除引用运算符(*
)时,返回地址处的值。 / p>
int a = 90;
int *p = &a;
int *p;
*p = 60;
p
并在解除引用时导致未定义的行为,因为60不是有效地址。 (根据the answer to this question)。 int a = 90;
int *p = &a;
printf ("p is %d \n",*p);
printf ("a is %d \n", a);
printf ("address is %p \n",p);
*p = 100;
printf ("p is %d \n",*p);
printf ("a is %d \n", a);
printf ("address is %p \n",p);
a是90
地址是0028FED8
a是100
地址是0028FED8 *p = 100
更改a
处的值,而不更改p
包含的值。
答案 0 :(得分:2)
* p =& a甚至无法编译。 p是指向int的指针。它目前有一个未定义的值,因此为* p分配任何内容是未定义的行为,很可能会崩溃。但是,即使p 指向一个int,你只能将一个int赋给* p,而a是一个指向int的指针,而不是一个int,所以这不会编译。
在第二个示例中,* p = 60,p的值未定义,因此您尝试将60存储到内存中的未定义位置。瞬间崩溃。这个没有修改过,所以你的解释是错误的。 p未设置为60.您无法将p设置为int。您只能将其设置为指向int的指针。
正确:
p = &a;
*p = 60;
答案 1 :(得分:1)
你曾问过:
即,表达式* p = 100会更改a处的值,而不是p。
中包含的值
您可以阅读评论部分,了解每行C代码的解释,并且我没有使用确切的地址位置,而是使用任意地址进行演示:
int *p; // Stack variable pointer to integer type w/ p's address being 4 bytes @ 0x00000000
int a = 90; // Stack integer variable `a` and initializing it to the value of 90 located @ 0x00000040
*p = &a; // Dereferencing the pointer `p` to be equal to the address of `a` ... One would think
// that the address value of `a` 0x00000040 in hex would be stored into `a` which
// has the value of 64 in decimal, however this is not always the case and this should be
// undefined behavior, but can still compile and run depending on the compiler and architecture.
// It may run or crash or not even compile or build at all. Most compilers should throw an error.
*p = 100; // 'p' is located at 0x00000000 and contains the value 0x00000040 and by dereferencing it
// it will assign the value of 100 to the stack address location of 0x00000040. Thus this
// changes the value of `a` to 100
// These two statements are in a sense equivalent
*p = 100; a = 100;
// If one was to assign the address of `a` to `p` as such:
p = &a;
修改强>
// Therefor the statement `*p=100` will only work if the statement
// `p=&a` is defined and evaluated beforehand.
修改强>
现在关于基于标题的问题:"what does *p contain?"
和提供的原始代码*p
实际上包含垃圾或者在声明时分配给它的内容。
答案 2 :(得分:1)
你在开头写的代码:
int *p;
int a = 90;
*p = &a;
无效,第1行中的星号(*)表示它是一个指针,它不是第3行中的解除引用运算符。
以下代码:
int a = 90;
int *p = &a;
相当于:
int a = 90;
int *p;
p = &a;
(p)是指针,现在指向(a)
的地址*p = 100;
所以,你只需为a,a = 100赋值。 并且您从同一地址打印相同的值。
答案 3 :(得分:0)
根据多个来源,指针
p
在取消引用时指向一个值。
不完全。指针指向一个对象。取消引用指针会生成该对象。在需要值的上下文中使用对象会产生存储的值。
int *p = &a;
p
现在指向的对象是a
。
*p = 100;
解除引用p
会生成指向对象,即a
。由于这不是需要存储值的上下文,a
的值未被读取,因此它仍然是被赋予值a
的对象100
或者,简而言之,*p
表示a
,因此*p = 100
表示a = 100
。