编程开发 > C/C++ > 文章内容

C语音基础:指针运算符与指针表达式

2017-6-29编辑:daibenhua

  指针运算符与指针表达式

  在C中有两个关于指针的运算符:

  •&运算符:取地址运算符,&m即是变量m的地址。

  •*运算符:指针运算符,*ptr表示其所指向的变量。

  [例6-2]从键盘输入两个整数,按由大到小的顺序输出。

  main()

  {

  int *p1,*p2,a,b,t;/*定义指针变量与整型变量*/

  scanf("%d,%d",&a,&b);

  p1=&a;/*使指针变量指向整型变量*/

  p2=&b;

  if(*p1<*p2)

  {/*交换指针变量指向的整型变量*/

  t=*p1;

  *p1=*p2;

  *p2=t;

  }

  printf("%d,%d\n",a,b);

  }

  在程序中,当执行赋值操作p1=&a和p2=&b后,指针实实在在地指向了变量a与b,这时引用指针*p1与*p2,就代表了变量a与b。运行程序:

  RUN

  3,4

  4,3

  在程序运行过程中,指针与所指的变量之间的关系如图6-4所示:

  当指针被赋值后,其在内存的安放如a),当数据比较后进行交换,这时,指针变量与所指向的变量的关系如b)所示,在程序的运行过程中,指针变量与所指向的变量其指向始终没变。下面对程序做修改。

  [例6-3]

  main()

  {

  int*p1,*p2,a,b,*t;

  scanf("%d,%d",&a,&b);

  p1=&a;

  p2=&b;

  if(*p1<*p2)

  {/*指针交换指向*/

  t=p1;

  p1=p2;

  p2=t;

  }

  printf("%d,%d\n",*p1,*p2);

  }

  程序的运行结果完全相同,但程序在运行过程中,实际存放在内存中的数据没有移动,而是将指向该变量的指针交换了指向。

  当指针交换指向后,p1和p2由原来指向的变量a和b改变为指向变量b和a,这样一来,*p1就表示变量b,而*p2就表示变量a。在上述程序中,无论在何时,只要指针与所指向的变量满足p=&a;我们就可以对变量a以指针的形式来表示。此时p等效于&a,*p等效于变量a。

  6.3.2指针变量作函数的参数

  函数的参数可以是我们在前面学过的简单数据类型,也可以是指针类型。使用指针类型做函数的参数,实际向函数传递的是变量的地址。由于子程序中获得了所传递变量的地址,在该地址空间的数据当子程序调用结束后被物理地保留下来。

  [例6-4]利用指针变量作为函数的参数,用子程序的方法再次实现上述功能。

  main()

  {

  void chang();/*函数声明*/

  int *p1,*p2,a,b,*t;

  scanf("%d,%d",&a,&b);

  p1=&a;

  p2=&b;

  chang(p1,p2);/*子程序调用*/

  printf("%d,%d\n",*p1,*p2);

  return0;

  }

  void chang(int *pt1,int *pt2)

  {/*子程序实现将两数值调整为由大到小*/

  int t;

  if(*pt1<*pt2)/*交换内存变量的值*/

  {

  t=*pt1;*pt1=*pt2;*pt2=t;}

  return;

  }

  由于在调用子程序时,实际参数是指针变量,形式参数也是指针变量,实参与形参相结合,传值调用将指针变量传递给形式参数pt1和pt2。但此时传值传递的是变量地址,使得在子程序中pt1和pt2具有了p1和p2的值,指向了与调用程序相同的内存变量,并对其在内存存放的数据进行了交换,其效果与[例6-2]相同。

  思考下面的程序,是否也能达到相同的效果呢?

  main()

  {

  void chang();

  int *p1,*p2,a,b,*t;

  scanf("%d,%d",&a,&b);

  p1=&a;

  p2=&b;

  chang(p1,p2);

  printf("%d,%d\n",*p1,*p2);

  }

  void chang(int*pt1,int*pt2)

  {

  int *t;

  if(*pt1<*pt2)

  {

  t=pt1;pt1=pt2;pt2=t;

  }

  return;

  }

  程序运行结束,并未达到预期的结果,输出与输入完全相同。其原因是对子程序来说,函数内部进行指针相互交换指向,而在内存存放的数据并未移动,子程序调用结束后,main()函数中p1和p2保持原指向,结果与输入相同。

  6.3.1指针运算符与指针表达式

  在C中有两个关于指针的运算符:

  •&运算符:取地址运算符,&m即是变量m的地址。

  •*运算符:指针运算符,*ptr表示其所指向的变量。

  [例6-2]从键盘输入两个整数,按由大到小的顺序输出。

  main()

  {

  int *p1,*p2,a,b,t;/*定义指针变量与整型变量*/

  scanf("%d,%d",&a,&b);

  p1=&a;/*使指针变量指向整型变量*/

  p2=&b;

  if(*p1<*p2)

  {/*交换指针变量指向的整型变量*/

  t=*p1;

  *p1=*p2;

  *p2=t;

  }

  printf("%d,%d\n",a,b);

  }

  在程序中,当执行赋值操作p1=&a和p2=&b后,指针实实在在地指向了变量a与b,这时引用指针*p1与*p2,就代表了变量a与b。运行程序:

  RUN

  3,4

  4,3

  当指针被赋值后,其在内存的安放如a),当数据比较后进行交换,这时,指针变量与所指向的变量的关系如b)所示,在程序的运行过程中,指针变量与所指向的变量其指向始终没变。下面对程序做修改。

  [例6-3]

  main()

  {

  int*p1,*p2,a,b,*t;

  scanf("%d,%d",&a,&b);

  p1=&a;

  p2=&b;

  if(*p1<*p2)

  {/*指针交换指向*/

  t=p1;

  p1=p2;

  p2=t;

  }

  printf("%d,%d\n",*p1,*p2);

  }

  程序的运行结果完全相同,但程序在运行过程中,实际存放在内存中的数据没有移动,而是将指向该变量的指针交换了指向。

  当指针交换指向后,p1和p2由原来指向的变量a和b改变为指向变量b和a,这样一来,*p1就表示变量b,而*p2就表示变量a。在上述程序中,无论在何时,只要指针与所指向的变量满足p=&a;我们就可以对变量a以指针的形式来表示。此时p等效于&a,*p等效于变量a。

C语音基础:转移语句

热点推荐

登录注册
触屏版电脑版网站地图