C语言回顾-指针
-
指针变量
理解之后怎的第一步是在机器级上观察指针表示的内容,大多数现代计算机都将内存分割为字节,每个字节可以储存8位 的信息。
0 | 1 | 0 | 1 | 0 | 0 | 1 | 1 |
每个字节都有唯一的地址,用来和内存中其他字节相区别。如果内存中有n个字节,那么可以把地址看做0-n-1的数。
地址 | 内存 |
0 | 01010011 |
1 | 01110101 |
2 | 01110011 |
3 | 01100001 |
4 | 01101110 |
... | ... |
这就是指针的出处,虽然用数表示地址,但是地址的取值范围可能不同于整数的范围,所以一定不能用普通整形变量储存地址,但是我可以用特殊的指针变量储存地址。当指针p储存i的地址时,我们说p”指向“i,换句话说,指针就是地址,而指针变量就是储存地址的变量,他也是一种数据类型
-
现在,我们来看看指针变量的声明。指针变量的声明与其他普通变量的声明基本一样,唯一的不同就是必须在指针变量名字前放置星号*。
-
例如:int i,a[10], *p,*q;
-
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