C语言回顾10-04-19

C语言回顾-指针


  • 指针变量

理解之后怎的第一步是在机器级上观察指针表示的内容,大多数现代计算机都将内存分割为字节,每个字节可以储存8位 的信息。

01010011

每个字节都有唯一的地址,用来和内存中其他字节相区别。如果内存中有n个字节,那么可以把地址看做0-n-1的数。

地址内存
001010011
101110101
201110011
301100001
401101110
......

这就是指针的出处,虽然用数表示地址,但是地址的取值范围可能不同于整数的范围,所以一定不能用普通整形变量储存地址,但是我可以用特殊的指针变量储存地址。当指针p储存i的地址时,我们说p”指向“i,换句话说,指针就是地址,而指针变量就是储存地址的变量,他也是一种数据类型

  1. 现在,我们来看看指针变量的声明。指针变量的声明与其他普通变量的声明基本一样,唯一的不同就是必须在指针变量名字前放置星号*。

  2. 例如:int i,a[10], *p,*q;

  3. i和j都是整形变量,p,q就是指向整形对象的指针,C语言要求每个指针变量只能指向一特定类型的对象

  • 取地址符和寻址运算符

为使用指针,C语言提供了一中特殊设计的运算符。为了找到变量的地址,可以使用&,比如变量i,&i就是i在内存中的地址。为了获取指针对象,可以使用*运算符。如果p是指针,那么*p表示p当前指向的对象。

当我们定*p&i时,*p就是i的别名,不仅拥有和i一样值,而且对*p的修改,也会改变i的值。

那么之前,形式参数是不能改变实际参数的,如果我们把指针当成参数是不是就可以改变呢?我们编程实践一下:

#include<stdio.h>
void  change1(int *p)//用指针修改*p的值
{
	*p=100;
}
void change2(int n)//普通改变n的值
{
	n=1000;
}
int main()
{
	int n=10;//这里我们定义一个整形n等于10
	change1(&n);
	printf("n1=%d   ",n);//这里分别调用两个函数后查看n的值
	change2(n);
	printf("n2=%d",n);
	getchar();
	return 0;
}

我们编写了这样一个程序,大家可以猜猜看两次打印分别是什么值。那么实际打印效果是这样的:

可以看出来,第一个change函数改变了n的值,第二个并没有。这是因为,第一个传入的是n的地址并赋值给p,通过*p可以直接在内存里找到i的位置,然后改变是可以影响到原来的i的值的。而第二个是形式参数,他会重新开辟一块内存保留参数,并不会影响原来的实际参数。

  • 指针作为返回值

我们不仅可以为函数传递指针,还可以编写返回指针的函数。返回指针的函数是相对普遍的,当给定指向两个整数的地址中,下列函数返回指向两个函数中较大数的指针。

int *Max(int *a,int *b)
{
    if(*a>*b)return a;
    else return b;
}

但是在这我们需要注意,不能返回局部变量的地址,因为一旦函数返回,局部变量就会不存在了,所以指向局部变量的指针都是无效的。在有些时候,我们不想指针变量的值改变或者其他值改变,可以在定义的时候加上const,比如const int *p,那么p的值不会发生改变,在程序请求改变p的值的时候,会发生错误提醒。这个指针就被称为常量指针,

另外,还有一些指针和数组,指针和函数,指向指针的复杂内容,下次再做介绍。


17 : 35

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值