++在指针中的不同用法

时间:2013-12-03 08:04:40

标签: c pointers

我试图理解指针中++的组合。所以我编写了一个简单的程序(在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对。但是当我看到输出时,这并没有发生。它在两次都增加了细胞的价值。

1 个答案:

答案 0 :(得分:4)

如果检查operator precedence table,您将看到前缀增加(和减少)运算符与解除引用运算符*具有相同的优先级,并且这两个运算符都是从右侧计算离开。这意味着++*p++(*p)非常相同。

这也是*p++增加指针的原因,因为后缀++运算符的优先级高于解除引用运算符。