C语言讲义(all)(4)

2019-01-26 15:31

一个数组最后一个元素以后的内容应该属于程序代码,这是常规讲的,当然也可能是其他程序的数据或者代码,甚至是系统程序。当然,如果你的人品够好的话,那后面也可能什么都没有哦。所以这么做是还是比较危险的。不过话说回来,在windows系统下,现在这种问题基本会被避免。因为windows有自己的系统保护机制,对于内存的掌控相当严格,这点我尤为佩服。下面可以看看这个代码:

最下面的是报错的信息表,那个警告是编译器的事,因为我用了C99的编译环境,而文件是C++的,不过没什么不良影响,所以懒得改了,无须在意,也不多说了,有兴趣可以问我。

你可以注意到,这个简单至极的程序是有问题的。数组a[10]的大小只有10个元素,而我在复制的时候设定的是到a[100]。但是你可以看到,编译器没有报错。这并不是编译器的问题,而是C标准就是这么设定的,记住就好。但是运行时可能会报错。这点需要注意。

一维数组我觉得确实没什么太多可说的,下面介绍指针。

指针

很多人在学习指针的时候总是说一用指针就乱,或者一用就报错。其实这就是典型的C语言没入门的情况。指针是C语言的精华所在,规模稍大一些的程序基本都会用到指针,某种程度上,指针可以看成是将函数之间进行数据连接的针线。前面介绍过C语言中存在数据的作用域设定,而函数和函数之间就是不是同一个作用域,因此函数内声明的数据都是相对封闭的,而指针就可以将数据在函数间相互传递使用,处理的使用一个数据。也就是通过指针,函数AS可以处理函数BS中的数据,BS也可以处理AS中的数据,当然,实现起来还是需要具体的函数构造。

指针的存储的内容很简单,就是地址。如果你输出一个指针的内容,就是一个串数字,形式也没什么特殊的地方。但是C语言赋予了这串数字特殊的含义,那就是地址的位置。

说到地址,就是指内存的地址。内存是沟通硬盘和CPU的桥梁,当计算机需要处理硬盘中的文件时,就会把硬盘中相应的内容写入到内存里,因为只有内存的速度能跟上处理器。而当处理器在内存中找这个文件时,就是根据地址寻找的。内存的地址是从0开始的,如果补全的话,就是00000000H,最后的H表示的是16进制数,内存的地址都是以16进制数表示的。前面那些0其实都是没意义的,能代表的就是这个数据上限是多少位。如果一个指针的值是100H,那么这个指针指向的地址就是在内存中物理地址为100H的那个内存空间,明白没?

下面我声明一个这样的指针:

char *a=0;

相信指针的声明方式你还是会的,所以就不再罗嗦了。这样声明了一个指针的地址值为0的指针,而其指向的内容你是没法看的,不是代码有问题,而是操作系统存在保护,前端地址基本都是系统代码,这些内容系统是不会随便让你更改的,而不会随便让你看,不然随便一个程序不小心就能把系统搞得崩溃掉了,你懂吧?看也是不行的,我试过,结果程序运行后就出来那个蛋疼的程序问题提示。

指针的基本使用方法:

使用指针时,一般有两个目的,第一个是值的传递,另一个就是使用指针指向的数据。如果你使

已经声明了一个指针,另其指向一个对应类型的数据,那么需要用 * 符号来表示使用的是指针指向的地址的内容。下面我通过一个小程序来演示一下指针到低是如何工作的。

现在看起来是不是很清楚了?printf函数的第一个参数是*int_p,就是指向num,因为之前有int_p=#这条语句。其中&num表示的事num的地址,你再看一下这个改动,结果和上面是一样的:

所以int_p和&num的值是一样的,起相同的效果。 再看一下面这程序:

这里问题就在于char_p的属性上了。需要注意的是,char_p指向的是一个名为word的字符串,而C语言中,字符串的输出时使用的就是一个地址。也可以这么讲,字符串的名就是一个指针。你可以注意到,对char_p的赋值中,语句为:char_p=word;而之前的那个int类型的num则是通过&地址符实现的赋值。这就是字符串的特殊之处,所以当使用*char_p时,指向的值就是char_p

的数值对应的地址值,那么这个值是多少呢?我们看,char_p的地址是22ff30,这个是地址的内存存储值是‘A’,没错吧?因为word=“ASD”,第一个值就是“A。”那么‘A’值是多少呢?这个我忘了,不过小于200。这时printf(%7s,*char_p)的含义就是把地址值为‘A‘的内存的值取出来读,而这种非常靠前的内存的内容都是系统程序或数据,这种访问在windows系统下是违法的,所以会系统报错。看看下面这个改过的程序:

对char_p进行类型转换后,输出的值就是一个地址值,你可以和上面的截图里的值比较一下,可以发现char_p的值和num的地址相差不多,这主要是因为代码修改的问题,不过这也可以证实char_p的值就是一个地址数据。刚才写的有点歪,现在接着说这指针的使用。

指针的自加自减运算

指针的自加自减是很有意思的,因为char_p++不是单纯的自加1,而是很智能的自加对应类型数据大小的值,下面还是通过程序来演示这一特点:

首先,你可以看到,第一列的是的都是char_p指针指向的值和对应的地址。这里因为char类型数据的大小为1,所以在自加自减过程中指针的值是自加1的。而对应的一个int类型的数组在其指

针进行自加自减过程中指针本身的值变化则是以4为基础的。现在是否清楚了?如果你把数组的声明改为short,那么其变化大基本单位就是2了。

另外数组名的一大特性就是,都代表着数组的地址。上面的截图中你可以发现一个指针的声明就是int *int_p=number;这里number是一个int类型的数组名。和之前的char类型一样,都是不需要使用地址符完成这一功能的。

数组和指针

(假期写的 还算完整 无链表、队列、二叉树)

//运行环境 windows xp

我觉得之前讲的有一点混乱,所以决定利用现在把这里重新写一遍。其实这个讲义我是以书的模

式写的,在某种程度上也算是锻炼自己了,因此不必谢我。

不扯淡了,接下来开始将数组和指针的关系。尽管有些罗嗦,但是我还是想说,指针是C语言的

精华所在,配合结构体,构建了目前的计算机老一辈系统,目前的计算机系统依旧在很大程度上依赖C,assmbly等底层语言。所以C语言就算学的不太好,也要适当了解。另外关于计算机二级考试,其内容非常简单,笔试部分考前突击一下就差不多了,不用担心。

由于数组也是一种数据类型,所以其种类基本可以从整形,浮点,字符类型中继承过来。数组的

声明方式和常规变量的定义形式差不多,区别在于数据名后面的那个方括号 [ ]。在声明的时候,有几个注意事项和使用方法,下面逐个说明。 int array[10];//未赋值

int array[10]={0,1,2,3,4,5,6,7,8,9};//常规赋值

int array[]={0,1,2,3,4,5,6,7,8,9};//编译器负责赋值,亦叫初始列表赋值,别人的书上写的

上面的三行代码描述了int类型数组的常规声明形式。第一种是创建一个能容放10个int类型变量的数组。第二种是在声明的同时对数组进行初始化,这里需要注意的是,用这种方式进行赋值初始化


C语言讲义(all)(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:工业区物业管理之安全手册

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: