交换数值
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,就是一个不一样的房间了
希望以上的故事和分析能帮助你理解指针