指针和指针变量

访问变量的两种方式,一种是直接访问变量名的叫做“直接访问”;通过指针来访问的方式叫做“间接访问”。

指针

指针就是地址,地址就是指针。

指针变量

指针变量是用来存放一个变量的地址的,像下图,两个 * 的作用都不一样,Int *p里面的 * 是定义p是一个指针变量,是一个标识作用;printf("%d", *p);这里的 * 是取值运算符,用来取出p里面存放地址的值,是一个运算作用。因此,输出的最终结果是10。

int *p;
int a = 10;
p = &a;
printf("%d",*p);

//输出为 10

指针变量的类型

指针变量的类型也有整型int、浮点型float、字符型char,每种类型它的大小都不一样,当指针变量与存放地址的变量的类型不一致时,虽然能正常保存变量的地址,但是需要取值时,取出来的值不完整。如下图所示,因为int型大于char型,只会取出char所能及的数据。因此需要将*p进行类型强转,变成 *(int *)p,才能与int a匹配。

int a = 0x1234;
char *p;
p = &a;

printf("a的值为:%d", *p);

//a的值为:34

不同类型的指针变量,它的偏移量也会随之不同。int类型的偏移量为4字节,char类型的偏移量为1字节。
在这里插入图片描述
在这里插入图片描述

为什么需要指针

当你想把主函数main里面的变量通过传参,传到函数里面,并改变变量里面的值,这时候需要把变量的地址给传上去,因此,函数的参数需要用指针来承接,通过这样能够改变主函数里面两个变量的值。

#include<stdio.h>

void changeData(int *pdata1,int *pdata2)
{
	int tmp;
	tmp = *pdata1;
	*pdata1 = *pdata2;
	*pdata2 = tmp;
}
int main()
{
	int data1 = 1;
	int data2 = 2;
	
	printf("交换前data1=%d,data2=%d\n",data1,data2);
	changeData(&data1,&data2);
	printf("交换后data1=%d,data2=%d\n",data1,data2);
	
	return 0;
}

在这里插入图片描述

练习

一个小作业,输入三个数a,b,c;要求不管怎么输入,在输出时,a,b,c由大到小的顺序输出,用函数封装实现

#include<stdio.h>

int  getMax(int *a,int *b,int *c)
{
	int t;
	if(*a<*b){
		t = *a;
		*a = *b;
		*b = t;
	}if(*a<*c){
		t = *a;
		*a = *c;
		*c = t;
	}if(*b<*c){
		t = *b;
		*b = *c;
		*c = t;
	}
	return t;
}

int main()
{
	int a,b,c;
	
	printf("请输入三个数:\n");
	scanf("%d%d%d",&a,&b,&c);
	
	getMax(&a,&b,&c);
	printf("由大到小为:%d,%d,%d",a,b,c);
	
	return 0;
}

在这里插入图片描述

用指针变量来保存数组,并遍历数组

指针变量存放数组的方式:

int a[10] = {1,2,3,4,5,6,7,8,9,0};
int *p;
p = &a[0];
//也可以这样写  p = a;

遍历数组一般用for循环:

for(int i=0;i<10,i++)
{
	printf("%d ", *p++);
}

注意:一定要保证指针变量类型和数组变量类型一致,因为遍历数组的时候指针会按类型大小来偏移,偏移的每一位,都要对的上数组的每一个元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值