指针
指针是c语言中很灵活的一个内容,当然,灵活的都是较难掌握的。不过,只要理解其实质,学习,运用指针还是一件很轻松的事情的。
首先理解,1.什么是指针?
在c语言中,指针也同Int ,double 一样是一种数据类型,int 存放的是一个整型数字,double 存放的是一个双精度的数字,指针存放的是地址。记得老师讲过这样一个形象的例子:指针类似于一间仓库的门牌号。这个门牌号能体现这个房间的具体位置。
2.指针有什么用?
因为指针存放的是地址,所以指针能直接访问,传递那个地址上的数据和那个地址,这无疑对于我们下次即将说的 函数 有很大的方便。初步了解指针还是需要自己写几个小程序观察一下,然后就知道了。
在写程序之前,需要知道怎么用指针。
因为指针也是一个数据类型,所以它的用法和 int的用法差不多都是一样的。首先,1.定义指针 ,其格式为 数据类型(如 int ,double ,struct) + *标识符; 数据类型的意义是,你现在定义的这个指针所存放的地址是指向什么数据类型的,例如 int *p; 它的意思就是定义一个指向整型数字的指针变量。
那么,下面就写写小程序探索探索吧。
code:
#include<stdio.h> int main() { int a; //定义整型 scanf("%d",&a); while(a--) { int *p;//定义整型的指针变量 p=&a; //将a的地址赋给指针变量p //现在p存放的就是变量a所代表的数在计算机中所存放的地址了 printf("%d--",*p);//输出p指向的地址存放的内容 printf("%d ",p);//输出p的地址 } }
运行结果:
从上面的代码中可以很明确的看出,指正存放的是变量的地址。那么思考一下,指针的地址又该是多少呢? 把上面程序的最后一个语句的前面加上一句 printf("%d--",&p); 运行之后可以看出是这样的结果。
可见指针也是需要内存单元去存放的。
上面存在的还比较陌生的符号再说一下,* 有两种用的地方1.在定义的时候用到,代表定义了一个指针变量,(如 int *p),2.在表达式中出现,代表取内容符号,取得p存放的地址里面存放的内容,(如 *p) 。还有 & ,它被用作取地址符,取得内容所存放的地址,(如 &p)。
给两个数,交换这两个数,输出这两个数,相信每一位读者都会独立的写出此程序,但是为了麻烦起见,能否通过对地址的操作来交换这两个数呢?当然能。
code
#include<stdio.h> int main() { int a,b; int *p,*q,*w; //定义指针变量 scanf("%d%d",&a,&b); p=&a; //p存放变量a的地址 q=&b;//q存放变量b的地址 printf("1:%d %d ",*p,*q); //地址的交换,与两个数的交换方式一样 w=p; p=q; q=w; //此时p存放变量b的地址,q存放变量a的地址 printf("2:%d %d ",a,b); printf("3:%d %d ",*p,*q); printf("4:%d %d ",&a,&b); printf("5:%d %d ",p,q); }
运行结果:
还需要提示的是,c语言中的很多东西都是可以镶嵌重叠的,这我曾多次提到,而且指针也不例外 ,比如,你定义了这样一个变量 int **q;这个变量有什么用呢?它与int *p;有什么关系? 前面那个q代表着定义了一个二级指针,它的作用是指向一级指针的地址,如 q=&p; 把一级指针p的地址赋给二级指针 q。同时三级,四级都是一样的道理,只要记住指针保存的是地址,地址的内容与它所对应的数据类型有关。
指针被称为c语言中最难应用的部分,不过只要掌握原理,仔细想想,一些基础的问题还是能很容易想明白的。