【C语言基础07】地址和指针

   指针:表示复杂的数据结构;动态分配内存单元;方便地使用字符串;有效地使用数组;调用函数地时候能够获得一个以上地结果;能直接处理内存单元地址等。

7.1 地址和指针的概念

    程序中只需指出变量名,无需知道每个变量在内存中的地址,每个变量与具体地址之间的联系由C编译系统来完成。

    内存单元地址:

    内存单元内容:

    printf("%d",i):根据变量名与地址的对应关系,关系在编译时就已经确定,找到变量i的地址,然后由地址开始的4个字节中取出数据,即变量的值,把它输出。

    scanf("%d",&i):从键盘输入的值送到地址从102开始的4个字节内存单元中,称为直接访问方式。

    将变量i的地址存放在另外一个变量中,然后通过该变量来找到变量i的地址,从而访问变量i,称为间接访问方式。

    一个变量的地址就是该变量的指针。

7.2 指针变量

7.2.1 指针变量的定义

    指针变量也是一个变量,必须先定义后使用。

    定义指向变量的指针变量的格式:类型标识符 *变量名;

    例如:int i,j,*p

    定义整形变量i,j,还定义了指针变量p,指针变量名前的"*"号仅是一个符号,并不是指针运算符,表示定义的p的指针变量;

    类型标识符:表示该指针变量所指向的变量的数据类型,并不是指针变量自身的数据类型,所有指针变量都是存放变量地址的。

所有指针的类型相同,只是所指向的变量的数据类型不同。

    为了找到变量的地址,可以使用&(取地址)运算符。如果i是变量,那么&i就是i在内存中的地址。获得指针所指对象的访问,可以使用*(间接寻址)运算符。

如果p是指针,那么*p就是p当前指向对象的内容。

例:int i=3;*p;

    p=&i;

程序的第一句int i=3;*p; 定义了一个整型变量i和一个整型的指针变量p;i的初值为3,当执行p=&i之后,p指向i。此时&i就是i在内存中的地址,*p就是p当前所指向变量i的存储空间里面的内容。

7.2.2 指针变量的引用

   在定义了指针变量之后,就可以对该指针变量进行各种操作。

    例:7-1;

#include "stdio.h"
main()
{
	int i,j,*p,*q;
	scanf("%d,%d",&i,&j);
	p=&i;
	q=&j;
	printf("%p,%p\n",&i,p);
	printf("%p,%p\n",&j,q);
	printf("%d,%d\n",i,*p);
	printf("%d,%d\n",j,*p);
	q=p;
	printf("%d,%d\n",*p,*q);
	printf("%d,%d\n",i,j);
	return 0;	
} 

  

7.2.3 指针变量作为函数的参数

    地址调用的方法,在函数调用的时候,不能向形参传递变量的内容,而传递变量的地址,只有得到变量的地址,才能利用间接寻址方式在函数中去改变相应的地址单元中的数据值。利用指针变量作为函数的参数

    地址传递:

    ① 函数调用时,系统临时创建形参指针变量

    ② 实参将其地址复制一份给形参,于是形参指针变量与实参变量间建立了“指向”关系,即形参指令变量指向了实参所对应的存储空间

    ③ 函数调用过程中,利用形参指针变量间接地引用或修改实参对应存储空间中地数值

④ 当被调函数运行结束返回主调函数时,形参指针变量自动释放。注意:此时释放的是形参所占地临时存储空间,而不是释放实参所对应的存储空间。

   

    适用场合:

    ① 如果主调函数中有数值需要利用被调函数为其修改,则采用地址传递方式,将需要修改数值的变量地址作函数实参

    ② 地址传递方式还经常用于被调函数运行结束后,向主调函数带回多个运行结果的场合。由于函数的返回值每次仅能向主调函数带回一个数值,当有多个数值需要带回主调函数时,应采用地址传递方式

   

    函数的调用不能改变实参指针变量的指向,但可以改变实参指针变量所指向的存储空间中的值。

   

    例子:输入3个数,输出其中的最大整数和最小整数。

#include "stdio.h"
main()
{
	int a,b,c;
	printf("请输入三个数字:");
	scanf("%d,%d,%d",&a,&b,&c);
	int *da; 	int *db; 	int *dc; 
	int *xa; 	int *xb; 	int *xc; 
	da=&a,db=&b,dc=&c;
	xa=&a,xb=&b,xc=&c;
	void max(int *da,int *db,int *dc);
	void min(int *xa,int *xb,int *xc);
	max(&a,&b,&c);
	min(&a,&b,&c);
} 
void max(int *da,int *db,int *dc)
{
	int t;
	if(*da>*db&&*da>*dc)
	{
		t=*da;
	}
	if(*db>*da&&*db>*dc)
	{
		t=*db;
	}
	if(*dc>*da&&*dc>*db)
	{
		t=*dc;
	}
	printf("最大值为:%d\n",t);
}
void min(int *xa,int *xb,int *xc)
{
	int t;
	if(*xa<*xb&&*xa<*xc)
	{
		t=*xa;
	}
	if(*xb<*xa&&*xb<*xc)
	{
		t=*xb;
	}
	if(*xc<*xa&&*xc<*xb)
	{
		t=*xc;
	}
	printf("最小值为:%d\n",t);
}

7.3 指向指针的指针

    指针不但可以指向基本类型的变量,还可以指向指针变量,这种指向指针类型数据的指针变量称为指向指针的指针,或称多级指针。

    二级指针定义形式:

    类型标识符 **变量名

    例子:

    int a,*p,**p;

    a=22;

    p=&a;

    pp=&p;

    二级指针与一级指针是两种不同的数据类型,尽管它们都是地址,但不可以相互赋值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李秋天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值