C++指针--指针变量

来源:互联网 发布:电脑锣编程群 编辑:程序博客网 时间:2024/06/03 19:02

1.指针变量声明

  • (1)定义指针变量

    在变量定义语句int p, *p1, *q; 中用 定义的变量均为指针变量。因此该语句定义了名为p、p1与q三个整型指针变量。因为指针变量用于存放变量地址,而地址通常为4字节,所以指针变量的长度均为4个字节。

  • (2)指针变量赋值

    指针变量定义后其值为随机数,若此随机数为系统区的地址,则对该指针变量所指系统区某存储单元进行赋值运算,将改变系统区该单元中内容,可能导致系统的崩溃。所以,指针变量定义后必须赋某个变量的地址或0。
    给指针变量赋初值有三种情况:
    第一种情况是用取地址运算符”&”将变量地址赋给指针变量。如:p=&a;
    第二种情况是将一个指针变量中的地址赋给另一个指针变量,如:p1=p;
    第三种情况是给指针变量赋空值0,如q=0;表示该指针变量不指向任何变量。

  • (3)指针变量的引用

    指针变量的引用是通过指针运算符”*”实现。在上例中,*p与*p1均表示变量a,因此,第一个输出语句 cout<<*p 被执行后,输出的是变量a的内容100。而赋值语句 *p1=200;是通过指针变量p1间接的将数据200赋给变量a,因此,第二个输出语句中,a 、*p、 *p1同为赋值后变量a的内容200。

  • (4)指针变量初始化

    指针变量可以象普通变量一样,在定义指针变量时赋初值,如上例中,定义指针变量p的语句可写成:int *p=&a;

2.指针变量的运算

指针变量的运算有三种:赋值运算、关系运算与算术运算。
(1)指针变量赋值运算
指针变量赋值运算就是将变量的地址赋给指针变量。
(2)指针变量的算术运算
指针变量的算术运算主要有指针变量的自加、自减、加n和减n操作。

* 指针变量自加运算  指令格式:<指针变量>++; 指针变量自加运算并不是将指针变量值加1的运算,而是将指针变量指向下一个元素的运算。当计算机执行 <指针变量>++ 指令后,指针变量实际增加值为指针变量类型字节数,即:<指针变量>=<指针变量>+sizeof(<指针变量类型>)。* 指针变量自减运算 指令格式:<指针变量>――; 指针变量的自减运算是将指针变量指向上一元素的运算。当计算机执行 <指针变量>―― 指令后,指针变量实际减少为指针变量类型字节数,即:<指针变量>=<指针变量>―sizeof(<指针变量类型>)。自加运算和自减运算既可后置,也可前置。* 指针变量加n运算 指令格式:<指针变量>=<指针变量>+n; 指针变量的加n运算是将指针变量指向下n个元素的运算。当计算机执行 <指针变量>+ n 指令后,指针变量实际增加值为指针变量类型字节数乘以n,即:<指针变量>=<指针变量>+sizeof(<指针变量类型>)*n。* 指针变量减n运算 指令格式:<指针变量>=<指针变量>―n;

3.指针变量的关系运算

指针变量的关系运算是指针变量值的大小比较,即对两个指针变量内的地址进行比较,主要用于对数组元素的判断。
用指针变量求一维实型数组元素和,并输出数组每个元素的值及数组和。

# include <iostream.h>void main( void ){  int a[5]={1,2,3,4,5};  int *p,*p1;  p1=&a[4]+1;  for (p=&a[0];p<p1;p++)  cout <<*p<<'\t';  int sum=0;  p=&a[0];  while (p!=p1) sum+=*p++;  cout <<"\n sum="<<sum<<endl;}
 执行程序后:输出:  1 2 3 4 5  sum=15
程序中首先将数组尾地址+1赋给p1,如图7.4所示。在for 语句中,指针变量p为循环变量,数组首地址&a[0]赋给p。循环时先将循环控制变量p与p1中地址比较,若p<p1,则以*p方式输出数组元素a[i]的值,并将p自加指向下一个元素。此循环直到p≥p1为止。  在while语句中,仍用p作为循环控制变量,当p!=p1时,用sum=sum+*p;语句将数组元素值累加到sum中去,同时用 p++语句使指针变量p指向下一个元素,循环直到p=p1为止,最后输出数组元素之和。

4.指针运算符的混合运算与优先级

  • 指针运算符* 与取地址运算符&的优先级相同,按自右向左的方向结合。

      设有变量定义语句: int a, *p=&a;  则表达式:&*p 的求值顺序为先"*"后"&",即& (*p)=&a=p 。  而表达式:*&a 的求值顺序为先"&"后"*",即* (&a)=*p=a 。
  • “++”、”――”、”*”、”&”的优先级相同,按自右向左方向结合。

 int a[4]={100,200,300,400},b; int * p=&a[0]; 

为了叙述方便,假设系统给数组a分配的首地址为1000,

① b=*p++;

“ 按自右向左结合的原则,表达式 p++ 求值序顺为先”++”后”“,即:*(p++)。由于”++”在p之后为后置++运算符,所以表达式 的实际操作是先取*p值,后进行p++的自加操作。即赋值表达式 b=*p++; 等同于下面两条语句:
b=*p; // b=*p=a[0]=100
p++; //p=p+sizeof(int)= 1004“`
最后运算的结果为b=100,p=1004指向a[1]。

 ② b=*++p;

按自右向左结合的原则,表达式 ++p 求值顺序为先”++”后”“,即:(++p)。由于++在p之前为前置++运算符,所以表达式的实际操作是进行++p的自加操作,后取*p值。即赋值表达式 b=++p; 等同于下面两条语句:
++p; //p=p+sizeof(int)= 1008,指向a[2]
b=*p; // b=*p=a[2]=300
最后运算的结果为b=300,p=1008指向a[2]。

③ b=(*p)++;

由于括号内优先运算,所以表达式先取出*p(即a[2])的值并赋给b,然后将*p的值即a[2]内容加1。所以表达式等同于下面两条语句:
b=*p; //b=a[2]=300
a[2]++ ; // a[2]=300+1=301

④ b=*(p++);

由①可知,该表达式等同于*p++,运算结果为:
b=*p; //b=a[2]=301
p++; // p=p+sizeof(int)=1012,指向a[3]

⑤ b=++*p ;

该表达式先进行”*”运算,再进行”++”运算,即先取出*p的值,再将该值加1。因此表达式实际进行了如下运算:
b=++(*p)=++a[3]=400+1=401; p仍指向a[3]不变。

0 0
原创粉丝点击