一、指针变量的定义
变量的指针就是变量的地址。我们可以定义一个指向 变量(普通变量) 的 指针变量。这种指针变量,我们在定义的时候,会引入一个 * ,用于在定义的语句中表示“这是一个指针变量”。
一般形式:
类型标识符 *标识符 标识符:就是指针变量名字
int i,j; //普通变量
float k; //普通变量
int *mypoint1,*mypoint2; //定义两个指针变量,这两个指针变量 是指向整型变量的。
//指针变量定义时,变量名前面有个 *,这个是和普通变量最明显的区别。
float *pm3; //指向实型变量的指针
float *pm4; //指向实型变量的指针
如何让 整形指针变量 指向一个 整型变量 【整型指针变量只能指向整型变量,实型指针变量只能指向实型变量】
可以用赋值语句使一个整型指针变量指向一个整型变量(普通变量)
mypoint1= &i; //&地址符 等价于 mypoint1 指向了 i
mypoint2 = &j; //等价于 mypoint2 指向了 j
说明:
(1)“定义”指针变量的时候,指针变量前面是有“*”号的,表示这是正在“定义一个指针变量”。
但是,用指针变量的时候,指针变量名前面是没有 * 号的,所以指针变量名是 mypoint1,mypoint2,而不是 *mypoint1,*mypoint2.
(2) 一个指针变量只能指向同一个类型的变量(普通变量)
pm3=&k;
二、指针变量的引用
牢记:指针变量中只存放地址。不要将一个整型变量赋值给一个指针变量;
mypoint = 4; //这样是错误的,mypoint1是个指针变量,而4是个整数。
和指针变量相关的运算符有两个:
(1) &:取地址运算符。
(2) *:指针运算符(间接访问运算符),定义指针变量的时候,用到 * ,这个叫做指针运算符。
但是,如果 * 不出现在指针变量定义的场合,而且也不是一个乘法运算符,* 依旧是指针运算符,只不过代表的是该指针变量所指向的变量。
int a,b;
int *p1,*p2; //这里这个 * 表示这两个变量是指针变量。
a=100;
b=200;
p1=&a; //把变量 a的地址赋给了p1, ****现在p1指向了a
p2=&b; //把变量 b的地址赋给了p2, ****现在p2指向了b
printf("%d,%d\n",a,b);
printf("%d,%d\n",*p1,*p2); //*p1 指向的变量是 a; *p2 指向的变量是 b。 *p1=a=100;*p2=b=200;
//* 指针运算符 不用于定义指针变量的场合时,代表的是它所指向的变量
特殊写法解析:
(a) &*p1:&是取地址运算符,*是指针运算符,这两个运算符优先级相同,但是这两个运算符都是从右到左结合的;
因此先看 *p1 ,*p1代表的是p1所指向的变量,就是a,那么再执行&运算,就是 &*p1 等价于 &a;又因为 &a 它本身不就是 p1,所以 &*p1 等于什么也没有干。p1=&*p1; ==>p1=&a
(b) *&a:&是取地址运算符,*是指针运算符,这两个运算符优先级相同,但是这两个运算符都是从右到左结合的;
因此先看 &a ,也就是p1,那么再执行 * 运算,*&a=*p1,*p1代表的是p1指向的变量,所以也就是a,所以 *&a ==> a
(c) (*p1)++:*p1 是 a,所以(*p1)++ 就是 a++,这里a++就是100+1=101。
(d) *p1++:因为 ++和 * 同级,又是从右到左,所以 *p1++ =*(p1++); 但是注意,这里 p1是指向 变量a(p1保存变量a的地址),然而 p1++,就是内存地址+1,因为 p1是整型(占4个字节),所以 p1++就要跳4个字节。
例如:a 的内存地址是:0x0031fb4,p1++ 等价于 0x0031fb4+4= 0x0031fb8;
总述:地址是个数字,地址自加1是什么意思呢?
如果普通整型变量i,那么i++,i如果是4,那么i++是5,就是i这个变量对应的内存中的内容+1;
同理,指针变量自加 1,也肯定是这个指针变量中的内容要自加 1,但是这种本来是自加1的操作,对于指针来说就不一定是自加 1,自加几,取决于该指针变量所指向的变量类型,如果p1指向的是整型变量,那么 p1++的内容要加 4;因为 int 是4个字节,p1++ 意味着p1指向 i 之后的变量,要完整跳过4个字节,所以p1++后内存内容如下图所示:
p1++后的结果:
*(p1++)不再指向 a,他就指向 a后边的内存去了,这段内存就不知道是谁的,所以*p1++这个动作非常危险,因为你会改变不属于你的内存。
例题:
int *pmax,*pmin,*p,a,b;
a=5;
b=8;
pmax=&a;
pmin=&b;
if(a
{
p=pmax; //现在p 指向 a (就是p 保存 a 的地址了)
pmax=pmin; //现在pmax 指向 b(就是变成 pmax 保存 b 的值,把最大数的地址保存到pmax)
pmin=p; //pmin 指向 a (就是变成 pmin 保存 a 的值,把最小数的地址保存到 pmin)
}
printf("a=%d,b=%d\n",a,b);
printf("max=%d,min=%d\n",*pmax,*pmin);