C语言学习笔记—指针(二)为什么使用指针?

在这里插入图片描述

为什么要使用指针

我们首先引入一个例子:

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int a;
	a= 10;
	int *p;
	p = &a;
	
	printf ("a address is %p\n",&a);
	printf ("a address is %p\n",p);

	system("pause");
	return 0}

a的地址是系统随机分配的那么我们如果想要把数据存储在指定地址呢?

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int a;
	a= 10;
	int *p;
	p = &a;
	
	printf ("a address is %p\n",&a);
	printf ("a address is %p\n",p);
	int *p2 = (int * )0x0060ff00;
	*p2 = 10;
	printf("在内存的%p位置,存放值是%d\n",p2,*p2);
	system("pause");
	return 0}

另外假若我们通过编写一个函数要交换两个数据“”

#include <stdio.h>
#include <stdlib.h>

void swap(int a, int b)
{
	int tmp;
	tmp = a;
	a = b;
	b = tmp;
}
int main()
{
	int main ()
	int a = 10;
	int b = 5;
	
	swap(a,b);
	
	printf ("a=%d\n",a) ;
	printf ("b=%d\n",b);
	
	system("pause");
	return 0}

我们观察是否能够实现交换
在这里插入图片描述
结果是否定的,那我们再换一种方式呢?

#include <stdio.h>
#include <stdlib.h>

void swap(int *a, int *b)
{
	int tmp;
	tmp = *a;
	*a = *b;
	*b = tmp;
}
int main()
{
	int main ()
	int a = 10;
	int b = 5;
	
	swap(&a,&b);
	
	printf ("a=%d\n",a) ;
	printf ("b=%d\n",b);
	
	system("pause");
	return 0}

结果:
在这里插入图片描述
为什么呢?我们在引入一个例子:

#include <stdio.h>
#include <stdlib.h>

void jiajiaA(int a)
{
	a = a+1;
	printf("jia:a = %d\n",a) ;
}
int main ()
{
	int a = 10;
	jiajiaA(a) ;
	printf ( "a=%d\n",a) ;
}
	system ( "pause" ) ;
	return 0;

我们观察自定义函数和主函数中的结果是否一致:
在这里插入图片描述
显而易见不一致,那我们在这里说以下内存的过程:
假设我们有一栋楼,我们在三楼某个房间里存放着主函数里的a=10, 那我们知道函数调用以后被调用的时候形参才存在 ,虽然两个都是a,但是在内存中是两码事,也就是说在其他房间也有一个a = 10(假设在第四层某个房间),函数调用的时候就是用的第四层的a进行计算,而对于主函数,调用的仍是第三层的a,函授调用以后第四层的a就不存在了,第三层的a从头到尾都没没有动过。
那么我们怎么才能改变第三层的值呢:

#include <stdio.h>
#include <stdlib.h>

void jiajiaA(int *p)
{
	*p = *p+1;
	printf("jia:a = %d\n",*p) ;
}
int main ()
{
	int a = 10;
	jiajiaA(&a) ;
	printf ( "a=%d\n",a) ;
}
	system ( "pause" ) ;
	return 0;

我们再看结果:
在这里插入图片描述
我们再来解析:

#include <stdio.h>
#include <stdlib.h>

void jiajiaA(int *p)//定义指针p
{
	*p = *p+1;//取出a的内容
	printf("jia:a = %d\n",*p) ;
}
int main ()
{
	int a = 10;
	jiajiaA(&a) ;//此时传过去的是a的地址
	printf ( "a=%d\n",a) ;
}
	system ( "pause" ) ;
	return 0;

调用结束以后p不存在了,a的值也发生了改变。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值