C语言中6组指针和自增运算符结合方式的运算顺序问题_C 语言

在C语言中,当指针运算符和++或者–结合时很容易分不清运算顺序,在这里总结一下,下面一共分析6中组合: * p++,(* p)++,* (p++),++* p,++( * p), * (++p)。

先看段代码以及输出:

#include<stdio.h>
int main()
{
  int a[3]={1,3,5};
  int *p=a;
  printf("----------------1----------------\n");
  printf("%d\n",*p++);
  printf("%d\n",*p);
  int i;
  for(i=0;i<3;i++)
    printf("%d ",a[i]);
  printf("\n");
  printf("----------------2----------------\n");
  p=a;//reset data
  printf("%d\n",(*p)++);
  printf("%d\n",*p);
  for(i=0;i<3;i++)
    printf("%d ",a[i]);
  printf("\n");
  printf("----------------3----------------\n");
  a[0]=1;//reset data
  p=a;
  printf("%d\n",*(p++));
  printf("%d\n",*p);
  for(i=0;i<3;i++)
    printf("%d ",a[i]);
  printf("\n");
  printf("----------------4----------------\n");
  p=a;
  printf("%d\n",++*p);
  printf("%d\n",*p);
  for(i=0;i<3;i++)
    printf("%d ",a[i]);
  printf("\n");
  printf("----------------5----------------\n");
  p=a;
  a[0]=1;
  printf("%d\n",++(*p));
  printf("%d\n",*p);
  for(i=0;i<3;i++)
    printf("%d ",a[i]);
  printf("\n");
  printf("----------------6----------------\n");
  p=a;
  a[0]=1;
  printf("%d\n",*(++p));
  printf("%d\n",*p);
  for(i=0;i<3;i++)
    printf("%d ",a[i]);
  printf("\n");
  return 0;
}

输出结果是这样的:

第一组:*p++,它的运算顺序是先返回 *p的值,然后p再++。
第二组:(*p)++,他的运算顺序是先返回 *p的值,然后 *p的值再++,这一点从运算后的数组a的值可以看出来。
第三组:*(p++),运算顺序是先返回 *p的值,然后p再++,也就是说它和 *p++的运算顺序一样。

这三组都是先返回 *p的值,区别就在于到底是p++还是 *p的值++。

第四组:++*p,先将 *p的值++,然后再返回 *p的值。
第五组:++(*p),先将 *p的值++,然后再返回 *p的值,所以它和++ *p是一样的。
第六组: * (++p),先将p的值++,然后再返回 * p的值,和 *++p是等价的。

这三组的特点是最后都是返回 *p的值,不同点在于是 *p先++还是p++。

以上就是本文的全部内容,希望大家可以喜欢。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c语言
, 指针
, 运算符优先级
自增运算符
c语言自增自减运算符、c语言指针运算符、自增自减运算符、自增运算符、python 自增运算符,以便于您获取更多的相关知识。

时间: 2024-11-08 18:48:58

C语言中6组指针和自增运算符结合方式的运算顺序问题_C 语言的相关文章

C++指针数组、数组指针、数组名及二维数组技巧汇总_C 语言

本文较为详细的分析了关于理解C++指针数组,数组指针,数组名,二维数组的一些技巧.是比较重要的概念,相信对于大家的C++程序设计有一定的帮助作用. 一.关于数组名 假设有数组: int a[3] = {1, 2, 3} 1.数组名代表数组第一个元素的地址,注意,不是数组地址(虽然值相等),是数组第一个元素地址,a 等同于 &a[0]; a+1是第二个元素的地址.比第一个元素地址a(或者&a[0])超出了一个整型指针的大小,在这里是4个字节(byte) cout << a <

浅谈关于指针作为参数并改变它的值的问题_C 语言

复制代码 代码如下: #include<stdio.h> int f(int *p){     p = p+1;     return printf("%d\n",*p); } void main(){     int a[]={1,2};     int *p = a;//指针p是首地址     f(p);//调用     printf("%d",*p);//p的值是不会改变的 } 结果:21Press any key to continue 复制代码

C 语言指针变量的运算详解_C 语言

指针变量保存的是地址,本质上是一个整数,可以进行部分运算,例如加法.减法.比较等,请看下面的代码: #include <stdio.h> int main(){ int a = 10, *pa = &a, *paa = &a; double b = 99.9, *pb = &b; char c = '@', *pc = &c; //最初的值 printf("&a=%#X, pa=%#X, pb=%#X, pc=%#X\n", &

剖析C++编程当中指针作为函数参数的用法_C 语言

在C语言中,函数指针变量常见的用途之一是作为函数的参数,将函数名传给其他函数的形参.这样就可以在调用一个函数的过程中根据给定的不同实参调用不同的函数. 例如,利用这种方法可以编写一个求定积分的通用函数,用它分别求5个函数的定积分: 可以看出,每次需要求定积分的函数是不一样的.可以编写一个求定积分的通用函数integral,它有3个形参: 下限a.上限b,以及指向函数的指针变量fun.函数原型可写为: double integral (double a, double b, double (*fu

c语言-C语言中A文件定义的文件指针,如何才能在B文件中也可以写入信息

问题描述 C语言中A文件定义的文件指针,如何才能在B文件中也可以写入信息 image.c和rtp.c都不是主函数,在image.c中定义了一个文件指针,但我想把rtp.c中的信息写入这个文件.简单就是在A文件中定义了一个指针文件,想把B文件中的信息写入指针文件.你可能问我为什么不直在B文件中定义,因为也要写入A文件中信息,像我之前写的运行时会提示rtp.c中的文件指针是未定义的标识符. 应该怎么写才是正确,麻烦知道的人给点指导,谢谢 解决方案 通过extern在rtp.c中声明该文件指针为外部指

语言 指针类型-C语言中, 指针类型char*有什么意义。

问题描述 C语言中, 指针类型char*有什么意义. C语言中,void*与char*之类的指针类型相比,有什么特殊的用途? 解决方案 如果定义成 void * 时,就无法取指针中的数据,因为数据类型不明确. 想要取 void * 中的数据,需要转换成想要的类型指针,如 char * 或 int * . 一般 void * 做参数参数时使用,可以接受 char * 或 int * 等其它类型指针的传入.如果定义成 char * 等固定类型,则无法接收除 char * 外的其它类型指针. 解决方案

c语言中,一个已定义的指针变量被置空后是如何&amp;amp;quot;记得&amp;amp;quot;它以前所指向的变量的类型的?

问题描述 c语言中,一个已定义的指针变量被置空后是如何"记得"它以前所指向的变量的类型的? 如题,比如定义了一个整型的指针p指向整型变量a : int *p = &a ; 然后将p置空:p = null; 这个时候指针p中所存放的数据即地址已经被清空了,但是再次http://ask.csdn.net/#使用p时还是只能 将其指向整型类型的变量,而不能指向其他类型的变量(比如字符型变量),那么p是 怎么"记得"它在被定义时候的类型的?它的值不是已经被清零了吗?

字符串截取-求助c语言中strtok的用法,关于指针的问题

问题描述 求助c语言中strtok的用法,关于指针的问题 写了一个分割字符串的方法,放在循环体调用出了点问题.请达人指点inline code void readraw(char *sentence){ raw_t *raw = malloc(sizeof(raw) *20); char *q = malloc(1024); const char *delim = "n"; char *p = strtok(sentence, delim); while (p) { printf(&q

对C语言中sizeof细节的三点分析介绍

以下是对C语言中sizeof的细节进行了详细的分析介绍,需要的朋友可以参考下   1.sizeof是运算符,跟加减乘除的性质其实是一样的,在编译的时候进行执行,而不是在运行时才执行.那么如果编程中验证这一点呢?ps:这是前两天朋友淘宝面试的一道题,小编理解: 复制代码 代码如下: #include<iostream> using namespace std; int main() {     int i=1;     cout<<i<<endl;     sizeof(