我试图理解指针中++的组合。所以我编写了一个简单的程序(在Ubuntu中使用virtualBox)来查看这些程序。我初始化了一个数组
...
int num[] = {1,2,3,4,5};
int *p,i;
p=num;
printf("num[] = ");
for (i = 0; i < 5; i++)
{
printf("%d ", num[i]);
}
printf("memory location of ptr: %p\n", (void *)p);
...
然后我执行这些命令然后再次打印与上面相同的内容。
*p += 1;
*p++;
(*p)++;
++(*p);
++*p;
,输出为:
//the array is init with these values
num[] = 1 2 3 4 5 memory location of ptr: 0xbfbed054
----- *p += 1; -----
num[] = 2 2 3 4 5 memory location of ptr: 0xbfbed054
---- *p++; -----
num[] = 2 2 3 4 5 memory location of ptr: 0xbfbed058
---- (*p)++; -----
num[] = 2 3 3 4 5 memory location of ptr: 0xbfbed058
---- ++(*p); -----
num[] = 2 4 3 4 5 memory location of ptr: 0xbfbed058
---- ++*p; -----
num[] = 2 5 3 4 5 memory location of ptr: 0xbfbed058
*p++
增加指针的内存位置,然后指向数组的下一个单元格。这是正确的吗? (我想数组的单元格会连续存储在内存中。?)另一方面,(*p)++
会增加指向的值。
我认为相同事情会发生在++(*p)
和++*p
对。但是当我看到输出时,这并没有发生。它在两次都增加了细胞的价值。
答案 0 :(得分:4)
如果检查operator precedence table,您将看到前缀增加(和减少)运算符与解除引用运算符*
具有相同的优先级,并且这两个运算符都是从右侧计算离开。这意味着++*p
与++(*p)
非常相同。
这也是*p++
增加指针的原因,因为后缀++
运算符的优先级高于解除引用运算符。