第九章 指针
变量的内存地址
例:使用取地址运算符&取出变量地址,然后将其显示在屏幕上
#include <stdio.h>
int main()
{
int a=0;
int b=1;
char c='A';
printf("a is %d,&a is %p\n",a,&a);
printf("b is %d,&b is %p\n",b,&b);
printf("c is %c,&c is %p\n",c,&c);
return 0;
}
地址格式符:%p
变量的地址:变量在内存中所占存储空间的首地址
变量的值:变量在存储空间中存放的数据
指针变量的定义和初始化
指针:存放变量的地址需要需要一种特殊类型的变量,这种特殊的数据类型叫做指针。
指针变量:具有指针类型的变量称为指针变量(专门用于存储变量的地址的变量)
定义:类型关键字 *指针变量名
如:int *pa
pa是一个指针变量,指向一个整型变量
例:使用指针变量显示变量的地址值
#include <stdio.h>
int main()
{
int a=0;
int b=1;
char c='A';
int *pa;
int *pb;
char *pc;
pa=&a;
pb=&b;
pc=&c;
printf("a is %d,&a is %p,pa is %p,&pa is %p\n",a,&a,pa,&pa);
printf("b is %d,&b is %p,pb is %p,&pb is %p\n",b,&b,pb,&pb);
printf("c is %d,&c is %p,pc is %p,&pc is %p\n",c,&c,pc,&pc);
return 0;
}
int *pa=&a;
等价于
int *pa;
pa=&a;
*只是指针类型说明符,不是间接寻址运算符
不能理解为将&a赋值给pa所指向的变量
含义:定义一个可以指向整型数据的指针变量pa,并用整型变量a的地址值对指针变量pa进行初始化,使指针变量pa具体的指向了整型变量a
间接寻址运算符
直接寻址:直接按变量名或变量地址存取变量内容的访问方式
如:
scanf("%d",&a);
printf ("%d",a);
间接寻址:通过指针变量(pa)间接存取它指向的变量(a)的访问方式
这需要运用指针运算符(间接寻址运算符):*
例:使用指针变量,通过间接寻址输出变量的值
#include <stdio.h>
int main()
{
int a=0;
int b=1;
char c='A';
int *pa=&a;//*作为指针类型说明符用于指针变量的定义
int *pb=&b;
char *pc=&c;
printf("a is %d,&a is %p,pa is %p,*pa is %d\n",a,&a,pa,*pa);//*作为间接应用运算符用于读取并显示指针变量中存储的内存地址对应的变量的值,即指针变量所指向的值
printf("b is %d,&b is %p,pb is %p,*pb is %d\n",b,&b,pb,*pb);
printf("c is %c,&c is %p,pc is %p,*pc is %c\n",c,&c,pc,*pc);
return 0;
}
按值调用与模拟按引用调用
例:按值调用
#include <stdio.h>
void Fun(int par);
int main()
{
int arg=1;
printf("arg=%d\n",arg);
Fun(arg);
printf("arg=%d\n",arg);
return 0;
}
void Fun(int par)
{
printf("par=%d\n",par);
par=2;
}
不能在被调函数中改变其调用语句中的实参值
按值调用也可以得到形参改变的值,但仅限于返回一个形参值
#include <stdio.h>
int Fun(int par);
int main()
{
int arg=1;
printf("arg=%d\n",arg);
arg=Fun(arg);
printf("arg=%d\n",arg);
return 0;
}
int Fun(int par)
{
printf("par=%d\n",par);
par=2;
return par;
}
模拟按引用调用(模拟c++中的按引用调用)
例:
#include <stdio.h>
void Fun(int *par);
int main()
{
int arg=1;
printf("arg=%d\n",arg);
Fun(&arg);
printf("arg=%d\n",arg);
return 0;
}
void Fun(int *par)
{
printf("par=%d\n",*par);
*par=2;
}
使用指针变量作为函数形参,形参需要接收一个地址
Fun函数中使用间接寻址运算符*改变形参指向的变量的值
用指针变量作函数参数的程序实例
输出最高分和该学生学号
函数的出口参数:指针形参所指向的变量的值在函数调用之后才确定
函数的入口参数:指针形参所指向的变量的值在函数调用之前确定
函数指针及其应用
函数指针:指向函数的指针
函数的入口地址:程序与数据共同存储在内存中,函数是子程序,也存储在内存中,指向存储这个函数的第一条指令的地址,称为函数的入口地址