程序员补课笔记(10)

原创 2004年08月24日 01:22:00
今天接着上天的二维数组,我们看看指向二维数组的指针是怎么的。在讲之前我想再重复一次,如果你自己理解好二维数组的就按你以往的去理解吧。不过多想想几种方法也是一件好事,那么下面就来讲讲了。
  现在来看看昨天的那个二维数组图,第九天图一。我们定义一个指向二维数数的指针
int a[3][4];
int *p;
p=a;
  其实这也指向一维数组的指针完全没有分别,二维数组因为是行优先的,一行下来就是列顺序了,我们可以这样来用指针指向列,如下:
p++;
  我们这里就是指向了第0行的第1列了,那么我们怎么可以到第下一行呢,其实定义数组时内存就给数组分配好一连串的连续空间,我们直接可以将指针继续往下移,当移到了0行最后一列时,加移的话就到了第1行了。其实C语言里还有一种更方面的指向方法,看如下:
int (*p)[4] /*这里是定义一个数指针,而这个指针是指向有数组四个元素的指针*/
我们看看这种定义的方式,*p为什么一定要括号括住呢,因为[]这个运算符比*优先,如果不加括号的话就变成了定义另一个指针最,至于是什么指针在最面就会讲到了,现在先来看看这种指针。
p=a;
p++; 这样会得到什么的结果呢?就是直接往下移一行了,这也是和前天说过的那个道理一样,是按照定义的类型结合来到运算的。我们知道了如何可以移行,那么该怎么移列呢?这个问题又更复杂一点了,试着把指针移到第1行第2列看看。我们先来看看这个表达式代表什么吧,a+1 这就是第一行的首地址吧,同理p+1也是指向第一行的首地址。至于列呢?先想想一维数组是怎么移到列的,就是首地址加上列序吧!那么我们就可以先表达出一维数组的首地址先,*(p+1)+2,看,这样是不是指向了第一行第二列了呢。我们不可以简单的理解(p+1)为行,从另一种意义上可以看成是列的首地址了(这里实在太难理解了,明还是有一点明,不过我还想用回自己一直对指针的理解好了,千万不要综合起来理解喔,这样就太错特错了)。
好了说回了二维数组成的现在来看看还有其它的什么指针,字符指针是比较简单的,不过也有它的一些特别之处。我们来看看以下的一些程序:
char *p;
p="ABC"; /*这里说说,既然是字符串就是一定有结束符的,这是和字符数组不同的*/
这样的赋值是可以的,这里是将字符串ABC的首地址赋给指针p,下现再看看另一个程序:
char a[4];
a="ABC";
  这里有错吗?对于C语言来说是错了的了,因为字符数组a是一个常量,不能给赋值。其它的高级语言就可以直接赋值给它就回事了,那么我们想把ABC赋给字符数组该怎么呢,这里有几种方法,一种就是一个一个字符赋值,一种就是利用指针,不过这里还是用回C语言函数库里的复制字符串函数完成strcpy();大家应该都对这个函数不默生吧,那好,现在就给五分钟做做练习,编制一个类于strcpy()的函数。…………时间真的过得快,我把我做的写出来吧。
mycpy(char *s1,char *s2)
{ for(;*s1++=*s2++;); }
好了,就这么短短二行就完成了复制功能,这只有C语言才能做到的。
现在再来看看以下两个程序吧
char *p,*q; char *p,*q,*r;
p="ABC"; r="ABC";
q="ABC"; p=r;
*q='D'; q=r;
printf("%s",%s",p,q); *q='D';
printf("%s,%s",p,q);

这里的答案是什么呢?自己先想想吧。
  好了,应该都想完了吧,现在就给出正确的答案,第一条程序是输出ABC,DBC,而第二条程序就是输出DBC,DBC。这里为什么呢?其实是因为第一个程序都是指向了同一个地址,那当然就是值一样啦。
现在就剩下函数指针了,其实我们平常也不怎么多人,但是老师还是给我们讲了一下,也提出了一个特别的地方,是今天我们才发现的,程序如下:
int b=0;
int a[2]={10,20};

int *ab(int *p)
{
p++;
return (p);
}
main()
{
b=*ab(a); /*这里我们试着将调用的函数返回的地址再加*号,看看可不可以指到那个值,至于结果怎么样,我们也没有试过,我在写这篇日记时也没有上过机试,大家有兴趣也试试吧,这个问题我们是怎么引出来的呢,其实我们一开始定义了一个指向函数的指针,就比如(*cd)()吧,我们提出了如果没有了括号会怎么样,因为本来(*cd)()就是指向一个返回指针值的函数,那么我们为了试验所以另编一个返回地址的函数来试试*/
printf("%d",b);
}
  好了,今天就将指针讲完了,不过指针的运用就还有很多在后面呢,就我知道的就有结构体和共用体还可以用到指针,跟着就是其它的一个综合运用链表、堆栈、队列等等的。我想我就是这方面还一点经验都没有吧,之前看了一下数据结构也没有太大的兴趣看下去了,因为我看到一大堆的指针都已经头晕了。不过近几天拿回来看看又好像明了些什么似的,反正就觉得不太头晕了吧。

给程序员推荐一些提高工作效率的工具

http://www.itjhwd.com/gcxytjyg/ 给程序员推荐一些提高工作效率的工具 一些高效的软件可以给我带来高效的工作效率。下面一些工具推荐给大家。欢迎补充 一、Xshe...
  • zdy0_2004
  • zdy0_2004
  • 2014年10月28日 22:08
  • 1182

黑马程序员学习笔记 Java的三大框架

如果做javaweb开发,spring是一定要学的,现在主流还是ssh,就是strurs+hibernate+spring,其中hibernate是持久层,用来持久化数据库操作的,如果不喜欢可以学点别...
  • Mr_April
  • Mr_April
  • 2015年07月03日 17:12
  • 1559

程序员的自我修养读书笔记

1.进程直接使用物理内存的坏处:第一、地址空间不隔离,一个进程可能改写另一个进程的数据,从而导致系统崩溃。第二、内存使用效率低,频繁的数据换入换出,效率低。第三、程序运行地址不稳定,每次重新装载的空闲...
  • Deep_l_zh
  • Deep_l_zh
  • 2016年06月26日 19:45
  • 2525

【好程序员笔记分享】——文件和目录处理

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 文件是Objective-C程序设计中是比较重要的一个概念。文件一般指存储在外部介质中的数据的...
  • likethesun121314
  • likethesun121314
  • 2015年04月18日 13:52
  • 304

黑马程序员:Hibernate基础知识

android培训、java培训
  • u012159707
  • u012159707
  • 2013年09月26日 15:42
  • 588

黑马程序员_学习笔记JAVA基础总结

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!------- 1、方法重载 方法覆盖 重载:一个类中一种功能的多种实现方式,调用哪种实现...
  • qq_27123965
  • qq_27123965
  • 2015年04月19日 14:39
  • 401

《程序员的自我修养》学习笔记之温故而知新

《程序员的自我修养》学习笔记之温故而知新。
  • zhouzxi
  • zhouzxi
  • 2016年12月08日 21:57
  • 2483

黑马程序员--Struts2复习笔记

--------
  • li951418089
  • li951418089
  • 2015年12月24日 10:26
  • 257

给程序员推荐一些提高工作效率的工具

一些高效的软件可以给我带来高效的工作效率。下面一些工具推荐给大家。 在日常的电脑操作中,我们常常花很多时间重复做着一件事情:退回桌面/开始菜单->寻找软件图标->点击启动。但如果你喜欢高...
  • truelove12358
  • truelove12358
  • 2015年08月27日 13:56
  • 779

【ECS】程序员如何打造属于自己的云笔记服务

摘要: 目录 前言 介绍 安装 启动服务 使用配置 APP访问 前言 在这个互联网知识呈爆炸增长的时代,作为一个程序员要掌握的知识越来越多,然再好的记性也不如烂笔头,有了笔记我们就是可以时常扒拉扒拉以...
  • qq_40954115
  • qq_40954115
  • 2017年11月27日 14:40
  • 208
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:程序员补课笔记(10)
举报原因:
原因补充:

(最多只允许输入30个字)