C Primer Plus学习_36指针更改主调函数中的值

查找地址: &运算符

指针(pointer)是C语言最重要(也是最复杂的概念之一)用于储存变量的地址。sancf()函数中就是用了变量地址作为参数。概括的说,如果主调函数不通过return来返回函数的值,那么就需要通过地址才能修改主调函数中的值

一元&运算符给出变量的储存地址。如果pooh是变量名,那么&pooh就是变量地址(地址可以看作是在内存中储存的位置)。在printf()语句中用%p,后面用&pooh,就可以输出地址( printf(“%p\n”, &pooh); )

更改主调函数中的值

temp = x;

x = y;

y = temp;

上面的语句实现了x, y是的互换,而如果是要在一个函数中实现呢?

/*swap.c*/ 
#include <stdio.h>
void interchange(int m, int n);

int main (void)
{
	int x = 5;
	int y = 10;
	
	printf("Original x = %d, y = %d\n", x, y);
	interchange(x, y);
	printf("Now x = %d, y = %d\n", x, y);
	
	return 0;
}

void interchange(int m, int n)
{
	int temp;
	
	temp = m; 
	m = n;
	n  = temp;
}

 

Original x = 5, y = 10

Now x = 5, y = 10

从运行结果可以看出,x和y的值并没有被改变。

还不够直观,在修改一下程序,在interchange()函数中加上两条

printf("Now x = %d, y = %d\n", m, n);

Original x = 5, y = 10

Now x = 5, y = 10

Now x = 10, y = 5

Now x = 5, y = 10

可以见到,在interchange()函数中两个值是成功对调了的,但是实际结果却没有通过interchange()函数传到主函数中去。

 

指针简介

指针,从根本上看是一个值为内存地址的变量(或数据对象)。Int类型变量的值是整数,那么指针变量的值是一个地址。

ptr = &pooh         //把pooh的地址赋给ptr

可以说是将ptr指向pooh,这里ptr和&pooh不一样,ptr是一个变量,而&pooh是一个常量(地址是常量)。换句话说,ptr是一个可以被赋值的东西,而&pooh是规定的地址。

间接运算符:*

这里的 * 不是代表乘号了,在指针应用中称为间接运算符,也称为解引用运算符。这些名称其实都……反正我是记不住,我一般念做“星号”。毕竟知道怎么使用才是重点。

ptr = &bah;   //取出bah 的地址

val = *ptr;      //将ptr 所指向地址的值,赋给val

上面两条语句,其实就是val = bah的意思。

声明指针

指针的声明,必须说明指针所指向的变量类型,因为不同变量类型占用的储存空间不同,一些指针操作要求知道操作对象的大小。另外程序也必须知道储存在指定地址上的数据类型。

int * p1;

float * p2;

char * pc;

……

诸如此类的定义,普通的变量定义很像,但其实质区别很大!指针实际上是一个新的类型,而不是整型或者浮点型。

使用指针在函数间通信

例程:

/*swap*/ 
#include <stdio.h>
void interchange(int u, int v);
void interchange2(int * u, int * v);
int main (void){
	int x1, y1;
	int x2, y2;
	x1 = 5;
	y1 = 10;
	x2 = 5;
	y2 = 10;
	printf("x1 = %d	y1 = %d\n", x1, y1);
	printf("----------------------------\n");
	printf("x2 = %d	y2 = %d\n", x2, y2);
	interchange(x1, y1);
	printf("----------------------------\n");
	printf("x1 = %d	y1 = %d\n", x1, y1);
	interchange2(&x2, &y2);
	printf("----------------------------\n");
	printf("x2 = %d	y2 = %d\n", x2, y2);
	
	return 0;
}
void interchange(int u, int v){
	int temp;
	temp = u;
	u = v;
	v = temp;
}
void interchange2(int * u, int * v){
	int temp;
	temp = *u;
	*u = *v;
	*v = temp;
}

运行结果:

x1 = 5  y1 = 10

----------------------------

x2 = 5  y2 = 10

----------------------------

x1 = 5  y1 = 10

----------------------------

x2 = 10 y2 = 5

这里可以看到interchange(),和interchange2()这两个函数的区别,其区别就在于一个用了指针来传参,一个只是普通的传参。同时我们也可以看到指针在这里的作用,他能将数值传回main(),而用普通的形参做不到的。在我们眼里,看到的是变量的名字,而在计算机内部看到的则是每一个变量的地址。interchange2()所调用的就是 x2, y2 的地址,所以在函数体内,函数直接对该地址所储存的内容进行了改动,进而导致了输出值的变化。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值