我不知道编译器使用++*p;
有人能用图解方式向我解释这段代码内存中发生了什么吗?
int main()
{
int arr[]={1,2,3,4};
int *p;
p=arr;
++*p;
printf("%d",*p);
}
答案 0 :(得分:2)
答案应为2
原因是++ * p实际上是将数组中的第一个成员递增1。
答案 1 :(得分:2)
您正在通过创建指向该元素的另一个int指针p
来递增该数组中的第一个元素。这条线
++*p
增加p指向的对象的值 - 在这种情况下,它是数组中的第一个元素。
答案 2 :(得分:1)
让我们走这条路:
++*p
这将首先取消引用p指针,因此访问arr [0],然后递增它。
如果你现在打印arr [0],它将是2。
然后打印* p与打印arr [0]相同,它等于2.
尝试将第一个元素替换为41,您的代码将打印42。
答案 3 :(得分:1)
当你有一个指针int *p
时,p
表示“内存地址p
指向,*p
表示”内存地址的内容{{1}指向“。p
表示预增量,这意味着将值增加1.由于++
和*
(前缀运算符)等一元运算符的关联性是正确的 - 向左移动,++
在从右向左移动时距*
更接近p
,++
在*
之前运行。因此{{1} }表示“递增++
指向的值”,而不是“递增++*p
然后获取值”。写p
更清楚,但它意味着同样的事情。
要理解的是“增加指针”之间的区别,这意味着指向另一个值(例如p
)和“增加指针指向的值”(例如++(*p)
)
你可以解决这个问题,但这是了解它所需要的所有信息。
答案 4 :(得分:1)
组成实际的内存地址并使用“ma”作为内存地址
在从1000开始的内存地址处,我们有4个连续的4字节(sizeof(int)= 4)个插槽。
每个槽包含数组初始化程序中给出的整数值:
arr
ma1000 ... ma1015
_____________________
| 1| 2| 3| 4|
_____________________
arr给出4个int插槽的起始地址和有多少个。
p保存整数的地址并引用内存中的一个8字节插槽(假设我们位于 64位系统,其中指针是8个字节 - 64个地址位/ 8位/字节)在2000年。
在语句p = arr之后,p保存地址1000
p *p or arr[0]
ma2000 .. ma2007 ma1000 .. ma1003
__________ ________
| 1000| | 1 |
__________ ________
* p给出p指向的内存地址的值。 p保存存储器地址1000,存储器地址1000包含1,因此* p结果为1。
++ * p表示用p增加int“指向”的值。 p保存存储器地址1000,其保存值1.地址1000处的值然后从1变为2
arr
ma1000 ... ma1015
_____________________
| 2| 2| 3| 4|
_____________________
printf然后在p的地址“指向”处输出int值,即2。
p *p or arr[0]
ma2000 .. ma2007 ma1000 .. ma1003
___________ ___________
| 1000| | 2|
___________ ___________
答案 5 :(得分:0)
这是理解指针的一个非常基本的概念。
p = arr ;
上面的代码将使指针“p”指向“arr”指向的内容。 “arr”本身指的是第一个元素。
*arr = *(arr + 0) = arr[0] = 1
*(arr + 1) = arr[1] = 2
*(arr + 2) = arr[2] = 3
依旧......
所以当你做++(*arr) that means ++(1) = 2
作为p = arr
,您可以进行剩余的替换和数学运算。