1.先来过一遍指针的概念
int a;char b;float c;
这里定义三种不同类型的变量
由它们所占字节数可得表:
int a | char b | float c |
1byte | 1byte | 1byte | 1byte | 1byte | 1byte | 1byte | 1byte | 1byte |
1001 | 1002 | 1003 | 1004 | 1005 | 1006 | 1007 | 1008 | 1009 |
a的内存地址为1001,b为1005,c为1006
那么我现在要找a,就要找到a的地址1001,找到这个地址,就可以把a的值取出来
那么通过地址找到所需的变量单元,就叫做:地址指向变量单元
那么指针就是这样一个变量的地址,可以说,指针是一个地址
好
接下来定义一个指针变量
“*” + “p”指针变量名
int 类型 也是该指针变量的类型,它只能指向int类型的变量
int *p;
指针变量,可不可以理解为是地址变量,也就是说,指针变量是存放地址的变量,指针变量的值是存放地址的变量
接着来完善这个指针的赋值,否则它毫无意义
int *p;
int a=2;
p=&a;
"&"是取地址符,“&a”很显然是去了a的地址,p=&a就是把a的地址给了p,那么取p所指向地址中的值就是*p=2
也就是
printf("%d",*p);
结果是2
很显然,上面的操作,明明可以直接
printf("%d",a);
来实现,指针好像是绕远了,但是想必大家都明白,指针不那么简单,它的作用远远不止于此
以下,补充一些指针引用的简单方式和一些细节:
1.这里printf函数中p前没有加“*”
#include<stdio.h>
int main(void){
int *p;
int a=2;
p=&a;
printf("%d",p);
return 0;
}
那么会出现下面的结果:
或者这样
原因:*p是所指向地址中的值,而p是地址,在printf函数中,打印出来的是a的地址的值,而不是a地址中的值,又由于地址值是随机的,所以会打出不同的结果
2.一个等价式子
*p=*&a=a
这个式子三个表达形式都表示赋给a的值
3.引用指针变量示例
我们来看一个例子
//输入a,b两个整数,按从大到小的顺序输出
#include<stdio.h>
int main(void){
int *p1,*p2,*p,a,b;
scanf("%d,%d",&a,&b);
p1=&a;p2=&b; //首先给指针变量赋地址
if(a<b)//先判断条件
{p=p1;p1=p2;p2=p;} //如果a<b,利用空指针实现地址的转换,此时*p1=b,*p2=a
printf("%d,%d\n",*p1,*p2); //输出结果先大后小
return 0;
}
我们输入2,9来测试,结果如下(注意输入的形式要与%d,%d相同,中间有逗号输入时要打上):
要注意,对指针变量进行交换,a,b的值不变
4.指针变量作为函数参数示例
上一个例子中,利用了指针在不改变a,b值的情况下实现了数值的转换,这个例子中,指针变量将作为参数参与函数的运算
//原理与3.中相同,实现输出最大值,最小值
#include<stdio.h>
void swap(int *p1,int *p2);//声明函数
int main(void){
int a,b,*po1,*po2;
scanf("%d,%d",&a,&b);
po1=&a;po2=&b;
if(a<b) swap(po1,po2);//函数调用
printf("max=%d,min=%d\n",a,b);
return 0;
}
//定义函数
void swap(int *p1,int *p2){
int temp;//创建空变量
temp=*p1; //转换操作
*p1=*p2;
*p2=temp;
}
可以看到,这里是将3.中的交换步骤改为引用函数来解决
我想会有这样几个问题
1.引用函数时
swap(*po1,*po2);
这样,结果会是:
原因:与函数的定义不同
void swap(int *p1,int *p2)
这里面是int *p1,也就是说,定义一个指针变量,不是说取一个指针变量,而引用函数,要保证给这个函数已经定义好的指针变量,也就是po1,po2,而若给*po1,*po2,则相当于给了两个常量值,这样自然不对。
2.函数定义有误
void(int *p1,int *p2){
int *temp;
*temp=*p1;
*p1=*p2;
*p2=*temp;
}
//很明显,这里定义了一个指针变量*temp,看似下面的交换赋值无误,但是不要忘了,指针变量还没有被赋予一个地址,也就是说,还没完成这个定义(具体可看文章开头)
接下来,再看一个例子,加深印象
实现输入三个整数,按照从大到小顺序输出
#include<stdio.h>
void exchange(int* q1, int* q2, int* q3);//声明两个函数
void swap(int* pt1, int* pt2);
int main(void) {
int a, b, c, * p1, * p2, * p3;
scanf("%d,%d,%d", &a, &b, &c);
p1 = &a; p2 = &b; p3 = &c; //给指针地址
exchange(p1, p2, p3);//引用函数
printf("%d,%d,%d\n", a, b, c);
return 0;
}
void exchange(int* q1, int* q2, int* q3) {
if (*q1 < *q2) swap(q1, q2);//引用函数,比较主函数中p1,p2,p3地址中值的大小
if (*q1 < *q3) swap(q1, q3);//利用swap函数三次引用实现三个数的交换
if (*q2 < *q3) swap(q2, q3);
}
void swap(int* pt1, int* pt2) {
int temp;
temp = *pt1; *pt1 = *pt2; *pt2 = temp;//熟悉的操作
}
我们输入2,3,4(注意逗号是英文输入法的),结果如下: