浅谈C语言指针

交换数值

C语言和JAVA这些面向对象的语言不一样,C语言是面向过程的,没有对象这一概念,也就是没有(new)这个关键字,所以说,函数里面的是局部变量就是局部变量,但是有时候想通过函数去改变主函数的值,又怎么办呢?

改变值,这里有个办法,就是地址,因为C语言只有地址这一个概念,无论是数组还是指针,都代表这地址,接下来的代码,通过交换数值这一小点,进行分析

	#include<stdio.h>
void f(int *a, int *b) {
	int *c;
	c = a;
	a = b;
	b = c;
	printf("局部%p,%p\n",a,b);
}
void f1(int *a, int *b) {
	int c;
	c = *a;
	*a = *b;
	*b = c;
	printf("局部%p,%p\n", a, b);
}
main() {
	int a = 5, b = 4;
	int *p = &a, *q = &b;
	f(p, q);
	printf("%d,%d\n%p,%p\n",*p,*q,p,q);
	f(&a, &b);
	printf("%d,%d\n%p,%p\n",a,b,&a,&b);
	printf("\n");
	f1(p, q);
	printf("%d,%d\n%p,%p\n", *p, *q, p, q);
	f1(&a, &b);
	printf("%d,%d\n%p,%p\n", a, b, &a, &b);

}

以上输出结果为:
局部00B3F8AC,00B3F8B8
5,4
00B3F8B8,00B3F8AC
局部00B3F8AC,00B3F8B8
5,4
00B3F8B8,00B3F8AC

局部00B3F8B8,00B3F8AC
4,5
00B3F8B8,00B3F8AC
局部00B3F8B8,00B3F8AC
5,4
00B3F8B8,00B3F8AC

这里的地址值,是不一定,因为每次存取地址不固定,关于具体的地址存放不是本篇重点,不予讲解,同时%p,是打印地址

分析:

通过看上面的例子以及输出程序,应该很容易看出,是交换的局部变量,还是交换的全局变量,因为如果局部变量的地址发生了变化,而主函数的地址却没变,那就对主函数没影响,就不管你传递的是值还是地址,都是无关的

同时,这里因为p是一个指针变量,然而p却代表的是地址,也就是你仅仅是在局部变量讲地址交换,而没交换地址里存放的东西,然后p就是代表地址里面存放的东西,下面通过一个小故事进行近一步讲解

A有2把房门钥匙,大小形状都是一样的,有一天,同时两房门也是相邻的(用房A、房B)表示,如果,你只是在局部交换地址,就是吧房A、房B的门牌号换了而已,里面的东西,钥匙孔都没更改,所以不影响,仅仅改变的就是一个门牌号。然而,如果你将里面的东西换了,你进房A的感觉就好比如进了房B,就是一个不一样的房间了

希望以上的故事和分析能帮助你理解指针

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值