第九章 指针
第二节 变量的指针和指向变量的指针变量-1
1. 指针变量的定义
变量的指针就是变量的地址,我们可以定义一个指向变量的指针变量,这种指针变量,我们在定义的时候,会引入一个*,在定义的语句中,表示"这是一个指针变量"
指针变量定义的一般形式: 类型标识符 *标识符 ,标识符就是指针变量的名字
inti//普通变量//指针变量定义是,变量名前有个*,这个需要区别int*mypoint;// 定义两个指针变量,这个指针变量,指向整型变量float*mp3;//指向实型变量的指针- 如何让整型指针变量指向一个整型变量,可以用赋值语句是一个整型指针变量指向一个整型变量(普通变量)
inti=10;// &是取地址符, 等价与mypoint1指向iint*mypoint=&i;- 说明:
定义指针变量的时候,指针变量前是有*的,表示正在定义一个指针变量,
但是使用指针变量的时候,指针变量名前是没有*的,指针变量名是mypoint
一个指针变量只能指向同一个类型的变量(普通变量)
inti=1;floatj=2.0;float*mypoint;mypoint=&i;//错误mypoint=&j;// 正确,类型相匹配2. 指针变量的引用
- 牢记: 指针变量中只存放地址,不要将一个整型变量赋值给一个指针变量
int *mypoint = 4;//mypoint是指针变量,而4是整数- 指针变量相关的运算符有两个
&: 取地址符, scanf()
*: 指针运算符(间接访问运算符):
a) 乘法运算符, 3*4
b) 定义指针变量的时候我们使用’*',这个叫指针运算符,若这个*不出现在指针运算定义的场合,也不是乘法运算符,那么这个*依旧是指针运算符,只不过代表的是该指针变量所指向的变量
#include<iostream>intmain(){inta=100,b=200;int*p1,*p2;//这里*表示这两个变量是两个指针变量p1=&a;//把变量a的地址赋给了p1,也就是说现在p1指向了ap2=&b;printf("a: %d, b: %d\n",a,b);printf("*p1: %d, *p2: %d",*p1,*p2);//==> *p1 == a, *p2 == breturn0;}解析(部分常见用法解析)
&*p1: 取地址运算符和指针运算符优先级相同,自右至左结合的,所以可以看作&(*p1), (*p1)代表但是p1指向的变量,
上例中为a, &(*p1)等价与&a,也就是p1.*&a:取地址运算符和指针运算符优先级相同,自右至左结合的,所以可以看作*(&a),上例可以看作*(p1),
也就等价于p1指向的变量,最终结果等价于a.
intd=*&a;//也就等价于intd=a;(*p)++: *p1是a, 所以等价于a++;
*p++: ++和*是同级的,从右到左结合,所以等价于*(p++),
int i=5; i++; // i=i+1 //同理 int *p; //同理,指针变量自加1,也就是变量p中的内容也要自加 //但是具体自加的数值和该指针变量所指向的变量类型有关,如果是整型,则地址增加4,int占4个字节 //意味着p指向下一个变量 *p++#include<iostream>intmain(){inta=100,b=200;int*p1,*p2;//这里*表示这两个变量是两个指针变量p1=&a;//把变量a的地址赋给了p1,也就是说现在p1指向了ap2=&b;printf("a: %d, b: %d\n",a,b);printf("*p1: %d, *p2: %d\n",*p1,*p2);//==> *p1 == a, *p2 == b// printf("(*p1)++: %d\n", (*p1)++);// 一定要注意这种用法printf("*p1++: %d\n",*p1++);//这里输出还是为100,因为是先输出*p1,然后再将p1的值自加printf("*++p1: %d\n",*++p1);//这里输出是200,p1先自加,再输出;return0;}- 指针的互相赋值
#include<iostream>intmain(){// pmax指向大值,pmin指向小值//仅作演示,方法不是最优int*pmax,*pmin,*p,a,b;a=1;b=8;pmax=&a;pmin=&b;if(a<b){p=pmax;pmax=pmin;pmin=p;}printf("pmax: %d, pmin: %d\n",*pmax,*pmin);return0;}