欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

理解指针与自增运算符 *p++ 的工作原理

最编程 2024-08-05 12:00:23
...

自增自减运算是经常考容易出错的知识点,加上指针这个令人头疼的,马上有想放弃的冲动。希望看了这篇文章能有所收获。

自增自减运算符语法自增运算符 ++ 使操作数的值加1,其操作数必须为(可简单地理解为变量)。++ 可以置于操作数前面,也可以放在后面,如:++i;i++;++i表示,i自增1后再参与其它运算;而i++ 则是i参与运算后,i的值再自增1.自减运算符--与之类似,只不过是变加为减而已,故不重述。对于d=(++b)+(++b)+(++b),不同的C语言编译器中结果可能不同,不做讨论。

指针和地址是一个概念。先理解地址和数据,想象内存里面是一个个的小盒子,每个盒子对应一个编号,这个编号就是地址,盒子里存放的就是数据。&是取地址运算符,如有 int a; 即有一个小盒子里面存放的数据起名叫a,&a就是取a的地址,即该盒子的编号。*(地址)是取值运算符,这里*是解引用操作符,可以理解成打开对应地址编号的盒子,取出里面的数据。*(&a) 就是打开a对应的小盒子,取出里面的数据,即*(&a)和a等价。我们定义一个指针变量int *p; p是指针变量,专门用来存放地址。int *p=&a;相当于int *p; p=&a; p存放的是a的地址,*p也等价于 a。指针变量p既然是变量,也同变量a一样对应一个小盒子,也有一个地址编号,&p就是取指针p的地址。

下面的代码我们来解析一下:

main()
{  
  int a[]={1,3,6,0,5};
  int *p=a;
  printf("%d,",*p);
  printf("%d,",*(++p));
  printf("%d,",*++p);
  printf("%d,",*(p--));
  printf("%d,",*p++);
  printf("%d,",*p);
  printf("%d,",++(*p));
  printf("%d,",*p);
}

前四个应该都没什么问题,不会有什么误解。

第一个printf里面*p对应a[0],输出1 。

第二个向移动指针指向a[1],然后输出3 。

第三个与第二个一样,先移动指针指向a[2],然后输出6 。

第四,输出6,然后指针减一,指向a[1] 。

第五个,错的就比较多了。大部分同学认为*p++和(*p)++是一样的,其实不然。根据优先级顺序,自增自减运算符 和 *(地址) 取值运算符优先级相同都是2,但这里注意它们的结合姓,都是右往左。所以*p++与*(p++)是等价的。

来验证下你的答案是否都对了呢?

最后我们在列表格总结一下: