苏小红 c语言程序设计 第九章 指针

本文深入探讨C语言中的指针概念,包括变量地址、指针变量定义与初始化、间接寻址运算符的使用,以及如何通过指针实现按引用调用,交换变量值等高级操作。同时,文章提供了丰富的代码示例,帮助读者更好地理解和掌握指针的运用。
摘要由CSDN通过智能技术生成

第九章 指针

变量的内存地址

例:使用取地址运算符&取出变量地址,然后将其显示在屏幕上

#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函数中使用间接寻址运算符*改变形参指向的变量的值

例:利用函数交换两个数的值

用指针变量作函数参数的程序实例
输出最高分和该学生学号
函数的出口参数:指针形参所指向的变量的值在函数调用之后才确定
函数的入口参数:指针形参所指向的变量的值在函数调用之前确定

函数指针及其应用
函数指针:指向函数的指针
函数的入口地址:程序与数据共同存储在内存中,函数是子程序,也存储在内存中,指向存储这个函数的第一条指令的地址,称为函数的入口地址

未使用函数指针

函数指针

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值