指针问题全解决

上传人:正** 文档编号:41627084 上传时间:2018-05-30 格式:DOC 页数:44 大小:69.99KB
返回 下载 相关 举报
指针问题全解决_第1页
第1页 / 共44页
指针问题全解决_第2页
第2页 / 共44页
指针问题全解决_第3页
第3页 / 共44页
指针问题全解决_第4页
第4页 / 共44页
指针问题全解决_第5页
第5页 / 共44页
点击查看更多>>
资源描述

《指针问题全解决》由会员分享,可在线阅读,更多相关《指针问题全解决(44页珍藏版)》请在金锄头文库上搜索。

1、本文转载至网络 指针对一部分初学者来说一直是一个无法逾越的障碍,没有指针的 C 语言就好 像没有左腿的短跑运动员。今天我来试试换一种方法来理解指针,希望能帮还 在为指针挣扎的朋友们理清思路,高手略过即可。我们先认为内存是一家客栈(看起来这和老掉牙的大楼的比喻没什么区别, 但是请你耐心看下去)。 同大部分的客栈一样,这家客栈有天、地、人等各种档次的房间,用现在的话 就是单人间、双人间、四人间等等。来住店的客人也是车水马龙,三教九流都 有,我们看看都有哪些人:快乐单身汉 char,还有 char 的小弟 unsigned char,他们只住单人间;short int, unsigned short

2、 int 都是已婚无孩,他们只住二人间;int, unsigned int, long int, unsigned long int,这些都是四口之家,当然住四 人间了;说起来这里面的前两位,int 和 unsigned char,在 dos 时代还是二人 世界,住二人间,后来出了 32 位系统后,他们才成为四口之家,等到了 64 位 时代,他们中有人会变成 8 口之家。人口变化太 快,所以人口问题就不讨论了, 只要知道有几口人(几个字节)就住几人间就行了。另外还有一些更庞大的家庭 double,float 我们就不一一赘述了。住客栈是要登记的,至少老板要知道哪个房间没人住,好租给新来的客人

3、吧?于是就把每位客人的房间号都记在了纸上,然后把纸卷在了针上,大大节 省了空间,这就是纸针(指针*)啦,_。为了安全,登记完的指针也放在客 房里了,不过是没有人住的房间。为了区分不同身份的客人(本客栈不搞歧视,区分身份只是为了便于管理) ,客栈用颜色不同的纸来记录房间号,这就有了不同类型的指针,比如蓝色的 char* 这种指针只记录单人间的房间号,红色的 int*只记录四人间的。看起来分 这么多种类很混乱,但是如果有很多同类型的组团(数组)来住店时就方便了, 上次 int a100来旅游的时候,就找到那一沓 100 张红色的指针就可以知道谁 住哪里了。比如团长 a0的房间号记在第一张纸 p 上

4、,那么翻开下一页 (p+) 你就找到了隔壁的房间号,你拿前四张去找人正好可以凑一桌麻将了。虽然指针分为很多颜色(类型),但是不管多大的家族都只住一间屋子,只有 一个房间号,所以无论什么颜色的指针都具有相同的大小,长度就是房间号那 么长。 并 非所有人都像 int a100那么幸运,他们来的时候正好一层 100 个房间都没 人住,于是他们可以住在同一片连续的区域。上次 m, n, p, q, r 一起来想住连续 的几个屋子,方便一起去玩,偏偏找不到合适的房间,只好 m 住 3 楼,n 住 5 楼,总之都很远。可是 m 老是来问老板他的朋友们住哪里?老板 每次要 找半天,后来想了个办法,把记录这几

5、个人的指针用一个盒子*p5(指针数组) 放在一起,这样就方便多了。有的客人脾气很怪,比如 char F4,他们四个是一个乐队的,可是又不愿住 四人间,非要一人住一间,还一定是连着的,如果不连着就不住,老板没办法, 给他们找了连着的四间房。可是大 牌还真是难缠,他们早上出去工作就退房, 晚上又要回来住,老板又要给他们找连续的四间房,天天如此,而且每次都浪 费四个指针,客栈的成本一下提高了。老板 又想了个办法,他专门为这些人订做了另一种颜色的指针(*p)4(指向数组的指针),他用这个指针记录他们 老大 F0的房间号,剩下的三位房间号就 是紧挨着的三间,减少了不少浪费。一直忘了介绍客栈的两个伙计,一

6、个叫“小 表示定义了一个指针类型的变量,这个指针变量的值应该是可以用来存放整数表示定义了一个指针类型的变量,这个指针变量的值应该是可以用来存放整数型变量的内存地址的。型变量的内存地址的。main()int *p;int a=5;p=printf(“%d %d“,p,a); 程序说明:程序说明:先定义了一个指针型变量。先定义了一个指针型变量。再定义了一个整型变量。再定义了一个整型变量。把整型变量的地址赋值给指针变量。把整型变量的地址赋值给指针变量。最后把这个地址和最后把这个地址和 a 变量的值输出。变量的值输出。 程序也可以这样写:程序也可以这样写:main()int a=5,*p=printf

7、(“%d %d“,p,a);这样称为变量赋初值。这样称为变量赋初值。不允许把一个数赋予指针变量,故下面的赋值是错误的:不允许把一个数赋予指针变量,故下面的赋值是错误的: int *p;p=1000; 被赋值的指针被赋值的指针变量前不能再加变量前不能再加“*”说明符,如写为说明符,如写为*p= 定义了一个整型变量,系统为这个整型变量分配一个内存地址。定义了一个整型变量,系统为这个整型变量分配一个内存地址。scanf(“%d”, 把读入的数据放在这个内存地址中。把读入的数据放在这个内存地址中。printf(“a=%d”,a); 把这个变量的值把这个变量的值(内存地址的值内存地址的值)输出。输出。而

8、如果改用指针,程序可以改为这样:而如果改用指针,程序可以改为这样:int a,*p=a;scanf(“%d”,p);printf(“a=%d”,a);(2) * 取取(指针指针)内容运算符内容运算符我们也可以通过一定的操作把指针中保存的地址所保存的内容提取出来。我们也可以通过一定的操作把指针中保存的地址所保存的内容提取出来。如:如:int a,*p=a;scanf(“%d”,p);printf(“a=%d”,*p);注意第一行注意第一行 int *p;中的;中的*号仅仅是为了说明号仅仅是为了说明 p 变量是一个指针变量。变量是一个指针变量。第三行的第三行的*p 是指把指针变量是指把指针变量 p

9、 所保存的内存单元地址中所保存的那个值输出。所保存的内存单元地址中所保存的那个值输出。如:输入如:输入 2,输出,输出 a=2.需要注意的是,我们定义好一个指针变量后,原则上会跟普通变量相联系,如:需要注意的是,我们定义好一个指针变量后,原则上会跟普通变量相联系,如:i nclude “stdio.h“void main()int *p; int a=5;printf(“%d %dn“,p,a);printf(“%d %d“,*p, 需要注意的是,虽然定义了需要注意的是,虽然定义了 p 指针变量,但是并没有把指针变量,但是并没有把 p= int a=5;p=printf(“%d %dn“,p,

10、a);printf(“%d %d“,*p, 输出:输出: 1245048 55 1245048第一行第一个数是指针变量保存的那个内存地址,即系统分配给第一行第一个数是指针变量保存的那个内存地址,即系统分配给 a 变量的内存地址,第二变量的内存地址,第二个数是个数是 a 变量的值。变量的值。第二行第一个数是第二行第一个数是 p 变量所保存的那个内存地址的值,即变量所保存的那个内存地址的值,即 a 的值。后一个数输出的是系统的值。后一个数输出的是系统分配给分配给 a 变量的内存地址。变量的内存地址。即此时:即此时:p=for(i=0;i=q)printf(“%d “,*p); 随时注意随时注意 p

11、,q 指针的变化指针的变化本例通过本例通过 C/C+试验系统编译。试验系统编译。输入:输入:1 2 3输出:输出:1 2 33 2 1 设有实数组设有实数组 a,指向,指向 a 的指针变量为的指针变量为 pa,可以得出有以下关系:,可以得出有以下关系:int a5,*pa=a; 则则pa,a,while(*m!=0 *m=*n;*n=temp; m+;n+;void main()int a6=10,13,5,122,51,0,*p=a,i;int b6=1,43,6,17,99,0; int *q=b;for(i=0;i*n)temp=*m;*m=*n;*n=temp; void main()

12、int a6=10,13,5,122,51,0,*p=a,i;int b6=1,43,6,17,99,0; int *q=b;for(i=0;i*n)temp=*m;*m=*n;*n=temp; m+;n+;i+;void main()int a6=10,13,5,122,51,0,*p=a,i;int b6=1,43,6,17,99,0; int *q=b;for(i=0;iM=3*37=111N=31M=31*3581=111011输入:N 的值 如:3输出:M 的值,写成 M=N*x 如 111=3*37参考程序:user1/44816/archives/2009/37514.html2

13、.分解质因数的递归实现。90=2*3*3*5,我们已经讲过的四个相关函数也在博客上。请参考。关于递归函数我们主要讲了四种典型题,分别是(1)岁数问题(2)n!问题(3)数列问题 1 1 2 3 5 8.其中数列问题可以有三个典型的程序来解决分别是 for 循环、数组和递归。(4) 分解质因数本题要求自行思考,特别要把博客上已经公布的四个程序看懂,下次周日课将讲解递归实现。参考程序将在上课后公布在博客上。参考程序:user1/44816/archives/2009/37461.html3. 最新上机课的编程题目题目描述:已知 a 数组无序,先用插入法从小到大排好序,b 数组已经有序,然后把 a

14、数组和 b 数组合并为一个 c 数组,使 c 数组依旧保持从小到大的顺序。已知:int a5=2,5,13,7,12,b5=1,2,4,7,9,c10;i nclude “stdio.h“ void sort(int st,int n) int k,x,j,i,m=1;for(k=1;kx)break;for(i=m-1;i=j;i-)sti+1=sti;stj=x;m+; void main() int a5=2,5,13,7,12,b5=1,2,4,7,9; int c10,i,j,k;sort(a,5); for(i=0;i5;i+)printf(“%d “,ai);i=0;j=0;k=0;while(i5 k+;i+; elseck=bj;k+;j+;while(i5)ck=ai;k+;i+;while(j5)ck=bj;k+;j+;printf(“n“);for(i=0;ik;i+)printf(“%d “,ci);

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号