3、 指针
3.1 指针与地址
在计算机中,内存是以字节为单位的连续存储空间,每一个字节都有一个编号,这个编号称为地址。
(1)任何变量在其生存期内都占据一定数量的字节。
(2)内存单元的地址与内存单元的内容是不相同的。
(3)一个变量的内存地址称作该变量的指针。
3.2 指针和指针变量
变量的内存地址就是变量的指针。指针变量顾名思义,就是用来存放内存地址的变量,也就是用来存放指针的变量。
3.2.1 指针变量的定义
假设p变量用来存放字符型变量所占用的存储单元的首地址,同时,假定已用某种方式将字符型变量a所占用的内存单元的首地址赋给了p变量,那么,想通过变量p取得字符变量a中的内同,可以按照以下步骤进行:
(1)根据变量p所占用的内存单元的首地址,读取其中所存放的数据,该数据就是字符变量a所占用的内存单元的首地址。
(2)根据第一步取出来的地址以及字符变量所占用的存储单元的长度,读取字符变量a的值。
指针变量定义的一般形式为:
类型说明符 *标识符;
一般变量的定义形式为:
类型说明符 标识符;
int *a; //该指针变量指向数据为整型数据
float *b; //该指针变量指向数据为浮点型数据
用变量的地址给指针变量赋值,要求变量的类型必须与指针变量的类型同。我们这样为指针变量赋值:
int b;
int *a=&b;
或
int *a;
a=&b;
int *p;
p=null;
实例1如下:
#include
void main()
{
int a=5,b=3;
int *x,*y; //定义两个指针变量
x=&a,y=&b;
printf("a=%d,b=%d\n",a,b);
printf("*x=%d,*y=%d\n",*x,*y);
}
3.2.2 指针变量的引用
&:取地址运算符。作用是获取变量的地址。形式为:&变量。例如:&a是获取变量所占内存空间的首地址。
*: 取内容运算符。作用是取指针变量指向的内容。形式为:*指针变量名。例如:*p表示指针变量所指向内存单元中的数据。
(1)将指针变量指向被访问的变量(先指向)
P=&a;
(2)访问所指变量(再取值或赋值)
取值:b=*p;
赋值: *p=10;
注意:如果在一个表达式中同时出现“&”和“*”,一定要小心的分析该表达式。“&”和“*”两个运算符的优先级别相同,但按自右而左的方式进行结合。例如:&*a;很明显的,a是一个指针变量,按照自右而左的顺序进行结合,首先取a指向的变量,然后再对该变量取地址,结果仍然是a。
乘法运算符“*”与取内容运算符“*”书写方法相同,但是这两个运算符是完全不相同的,两者之间没有任何联系。同样,位运算符“&”与取地址运算符“&”之间也没有任何联系。
实例2如下:
#include
void main()
{
int i=3,j=5; //定义整型数据i,j
int *p,*q; //定义整型指针变量p,q
p=&i,q=&j; //为p、q赋值
float a=5.8,b=7.9; //定义浮点型数据a,b
float *c,*d; //定义浮点型指针变量c、d
c=&a,d=&b; //为c、d赋值
char m='I',n='l'; //定义字符型变量m、n
char *x,*y; //定义字符型指针变量x、y
x=&m,y=&n; //为x、y赋值
printf("i=%d,j=%d\n",*p,*q);
printf("a=%f,b=%f\n",*c,*d);
printf("m=%c,n=%c\n",*x,*y);
}
3.2.3 指针的运算
指针变量同普通的变量一样,可以进行多种运算。对指针变量可以进行赋值运算、取地址运算、取内容运算、加减算术运算、关系运算。
1.&和*运算
&和*运算符的优先级同++ -- !等运算优先级别相同。并且是自右向左的结合方式。
*(++p) p的地址先加1然后取值
*++p 取地址p加1后的值
*(p++) 先取p的值,然后p指针加1
*p++ 先取p的值,然后p指针加1
++(*p) 先取p的值,然后值加1
实例3如下:
#include
int main(int argc, const char * argv[])
{
int a,b,c; //定义三个整形变量
int *pa,*pb,*pc;
pa=&a;
pb=&b;
pc=&c; //定义了三个指向整型数据类型的指针,并分别赋值
scanf("%d%d",pa,pb); //格式化输入1和2
printf("%d,%d\n",*pa,*pb);// 1 2
c=a+b;
printf(",%d\n",*pc);// 3
*pc=a+*pb;
printf(",%d\n",c);// 3
c=*pa**pb;
printf(",%d\n",*pc);// 2
c=++(*pa)+(*pb)++;
printf(",%d\n",c);// 4
c=(*pa)++ +*pb++;
printf(",%d\n",c);//5
printf(",%d,%d\n",a,b); // 3 , 3
return 0;
}
2.赋值运算
赋值运算的一般形式为:指针变量=指针表达式
(1)可以将一个指针变量的值赋给相同类型变量的一个指针变量。例如:
int a,*b,*c;
b=&a;
c=b;
(2)可以将数组的首地址赋值给指针变量。例如:
int a[10],*b;
b=a;
3.算术运算
(1)指针变量与整数相加、减
将指针加上或减去某个整数值,表示将指针向前或向后移动n个数据单元。如:
int a[5],*b,*c;
b=&a[1];
c=b+2;
(2)指针变量的自增、自减运算
变量自增、自减的一般形式为:
p++,p--,++p,--p
其中p为指针变量。
4.关系运算
指针变量之间的关系运算与一般变量之间的关系运算方式是相同的。
|
|