![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c语言学习
文章平均质量分 66
c语言学习
可乐CC+
这个作者很懒,什么都没留下…
展开
-
C/C++/VS2022/指针/数组 调试出现debug
这个情况就很难受,编译没错,但是运行出现问题了,如果点击中止(重试、忽略)下一次运行还是会出现,看了显示的大致意思是在数组arry上出现了什么错误,经过检查发现,原来是数组在数入时,它的长度出现了问题,等于了MIN。将等于号取出后就无错了。原创 2023-10-04 16:31:28 · 431 阅读 · 0 评论 -
结构体和数据结构--结构体指针的定义和初始化
如下图所示,由于pt指向了STUDENT结构体数组stu的第一个元素stu[0]的首地址,因此,可以用指向运算符来引用pt指向的结构体成员。而p+1指向的是下一个结构体数组元素stu[1]的首地址,pt+2指向的是stu[2]的首地址,以此类推。因()的优先级比成员选择运算符的优先级高,所以先将(*pt)作为一个整体,取出pt指向的结构体的内容,再将其看成一个结构体变量,利用成员选择运算符访问它的成员。使指针pt指向结构体变量stu1所占内存空间的首地址,即pt是指向结构体变量stu1的指针。原创 2023-07-03 15:25:15 · 1009 阅读 · 0 评论 -
数组与指针--常见的内存错误及其对策(1)
调用次数越多,丢失的内存越多。内存被释放后,指针的值(即栈内存的首地址)其实并没有改变,它仍然指向这块内存,只不过内存中存储的数据,使该内存存储的内容变成了垃圾。(2)、配套使用malloc()和free(),并尽量让malloc()和与之配套的free()集中在一个函数内,尽量把malloc()放在函数的入口处,free()放在函数的出口处。虽然程序中的malloc()和free()是配套使用的,但当前面的malloc()调用成功但后面的调用不成功时,直接退出函数将导致前面已分配的内存未被释放。原创 2023-06-26 16:41:42 · 1162 阅读 · 0 评论 -
结构体和数据结构--结构体数组的定义和初始化
一个结构体变量只能表示学生成绩管理表中的一个学生的记录信息,代表其中的一个实例,而实际数据库中有多个学生的记录,每个记录对应一个学生的信息,如何表示这么多具有相同结构体的学生记录呢?显然,相对于定义多个结构体变量而言,定义一个结构体数组是最简单的方法。程序如下,之前的程序差不多,增加了一个计算平均分的功能,主要突出显示数组在结构体的示例。也可以在定义结构体数组的同时对其进行初始化。例题:利用结构体数组计算每个学生的4门课程的平均分。二、结构体数组的初始化。一、结构体数组的定义。一、结构体数组的定义。原创 2023-07-01 18:26:33 · 3078 阅读 · 0 评论 -
结构体和数据结构--向函数传递结构体
用结构体变量作函数实参,向函数传递得是结构体得完整结构,即将整个结构体成员得内容复制给被调函数。可以看出,向函数传递结构体变量时,实际传递给函数的是该结构体变量成员值得副本,这就意味着结构体变量得成员值是不可能在被调函数中被修改的。和其他变量一样,仅当将结构体的地址传递给函数时,结构体变量的成员值才可以在被调函数中被修改。用指向结构体的指针变量或结构体数组作函数实参的实质是向函数传递给结构体的地址,因为是传地址调用,所以在函数内部对形参结构体成员值得修改,将影响到实参结构体成员的值。原创 2023-07-03 16:44:54 · 5138 阅读 · 0 评论 -
指针与数组--动态数组(1)[1、C程序的内存映像 2、动态内存分配]
定义方式如下:int m,n;能否在程序运行的过程中根据用户的需求生成可变长度的动态数组呢?这就要用动态内存分配函数来实现。C的动态内存分配函数从堆上分配内存。使用这些函数时只要在开头将头文件<stdlib.h>包含到源程序中即可。原创 2023-06-24 12:57:53 · 1084 阅读 · 0 评论 -
指针与数组--常见的错误(2)[缓冲区溢出攻击]
网络黑客常常针对系统和程序自身存在的漏洞,编写相应的攻击程序。简而言之,缓冲区溢出通常是因gets()、scanf()、strcpy()等函数未对数组越界加以监视和限制,导致有用得堆栈数据被覆盖而引起的。原因就出在函数gets()上面,它不能限制用户输入字符串的长度,当用户输入的字符串长度超过N时就会发生缓冲区溢出。当被压入栈的数据大于1024,超出1024个字节的内容就会依次覆盖堆栈中保存的寄存器、函数调用的返回地址。(2)在堆栈中,保存函数调用的返回地址(即函数调用结束后要执行的语句的地址);原创 2023-06-26 17:09:51 · 183 阅读 · 0 评论 -
指针与数组--动态数组(2)[1、长度可变的一维动态数组 2、长度可变的二维动态数组]
程序第11行语句像系统申请n个int型的存储单元,用int型指针变量p指向了这段连续存储空间的首地址。这就相当于建立了一个一维动态数组,可通过首地址p来寻址数组中的元素,即可以使用*(p+i)或者p[i]来表示数组元素值。因为堆栈空间是有限的,所以动态分配内存后,必须用第12~16行语句检测函数malloc()的返回值,确保指针使用前是非空指针(不是NULL)。例题2:编程输入m个班学生(每个班n个学生)的某门课成绩,计算并输出平均分。最后,不要忘记使用free()释放不再使用的动态申请的内存。原创 2023-06-24 15:14:24 · 365 阅读 · 0 评论 -
结构体和数据结构--动态数据结构体-单向链表
第2部分是一个结构体指针,称为链表的指针域,用于存储其直接后继的节点信息,这里用next表示,next的值实际上就是下一个节点的地址,即next指向下一个节点,当前节点为末节点时,next的值设为空指针(NULL),表示链表的结束。(3)若在链表中间插入新节点,则将新节点的指针域指向下一节点(p->next = pr->next),且让前一节点的指针域指向新节点(pr->next = p)。注意:节点被删除后,指标是将它从链表中断开而已,它仍然占用内存,必须释放其所占的内存,否则将出现内存泄漏。原创 2023-07-10 18:53:58 · 888 阅读 · 0 评论 -
文件操作--文件的打开合关闭
fopen()函数的返回值是一个文件指针(File Pointer),FILE是stido.h中定义的结构体类型,封装了与文件有关的信息,如文件句柄、位置指针及缓冲区等。因为操作系统对于同时打开的文件数目是有限的,所以在文件使用结束后必须关闭文件,否则会出现意想不到的错误。此外,不建议以读写方式打开文件,因为读写其实共用一个缓冲区,每次读写都会改变文件位置指针,很容易写乱,破坏原来文件的内容,并且需要调用文件定位函数才能在读写之间转换。以“r”方式打开的文件,只能读出,而不能向该文件写入数据。原创 2023-07-11 16:25:17 · 252 阅读 · 0 评论 -
结构体和数据结构--共用体
person-》marryFalg是用来标志婚姻状况的,因为表示婚姻状况的共用体变量有三个,如果不设定标志我们无法得知是使用的哪个。本例中的共用体成员i占2个字节,ch占1个字节,f占4个字节 ,于是f的前1个字节就是为ch分配的内存空间,而前2两个字节就是为i分配的内存空间。这是因为,虽然共用体与结构体都是不同类型的数据组织在一起,但与结构体不同的是,共用体是从同一起始地址开始存放成员的值,即共用体中不同类型的成员共用同一段内存单元,因此必须由足够大的内存空间来存储占据内存空间最多的那个成员,所以。原创 2023-07-05 18:54:23 · 407 阅读 · 0 评论 -
结构体和数据结构--从基本数据类型到抽象数据类型、结构体的定义
是指这样一种数据类型,他不再单纯是一组值的集合,还包括作用在值集上的操作的集合,即在构造数据类型的基础上增加了对数据的操作,且类型的表示细节及操作的实现细节对外是不可见的。总之,系统位结构体变量分配内存的大小,或者说结构体类型所占内存的字节数,并非是所有成员所占内存字节数的总和,它不仅与所定义的结构体类型有关,和与计算机系统本身有关。在对两个同类型的结构体变量进行赋值时,实际上是按结构体的成员顺序逐一对相应成员进行赋值的,赋值后的结果就是两个结构体变量的成员具有相同的内容。放在函数体内声明称为局部声明。原创 2023-07-01 17:57:45 · 2180 阅读 · 1 评论 -
结构体和数据结构--枚举数据类型
除非特别指定,一般情况下第1个枚举常量的值为0,第2个枚举常量的值为1,第3个枚举常量的值为2,以后依次递增1。在上面的枚举类型声明语句中,response被称为枚举标签(Enumeration Tag),当枚举类型和枚举变量放在一起定义时,枚举标签可省略不写。在上面的第一句声明了名为response的枚举类型,它的可能取值为:no,yes或none。注意,虽然枚举标签后面花括号内的标识符代表枚举类型变量的可能取值,但其值是整型常量,不是字符串,因此只能作为整型值而不能作为字符串来使用。原创 2023-07-08 10:23:54 · 160 阅读 · 0 评论 -
文件操作--二进制文件和文本文件
数据无法长时间保存,因此我们可以通过使用文件操作,用文件保存键盘输入和屏幕输出的数据,将数据以文件的形式存放在光盘、磁盘等外存储器上,可以达到重复使用、永久保存数据的目的。,缓冲型文件系统中的文件操作,也称为高级文件操作,高级文件操作函数是ANSI C定义的可移植的文件操作函数,具有跨平台和可移植的能力,可解决大多数文件操作问题。因此接下来主要介绍高级文件操作函数。缓冲型文件系统是指系统自动在内存中为每一个正在使用的文件开辟一个缓冲区,作为程序和文件之间数据减缓的中介,缓冲文件系统利用文件指针标识文件。原创 2023-07-10 19:41:55 · 239 阅读 · 0 评论 -
指针和数组--指针数组及其应用
所以,无论每个字符串的实际长度是否一样,在内存中都占有相同长度的存储单元,都要按照最长的字符串的长度来为每个字符串分配内存。而用指针数组存储每个字符串的首地址时,字符串排序时无需改动字符串在内存中的存储位置,只要改变指针数组总个元素的指向即可。指针数组是一个数组,只不过是指针作为数组的元素,形成了指针数组。指针数组和指向数组的指针是有区别的,指向数组的指针是一个指针变量,指针变量中保存的是一个数组的首地址。由定义可知,指针数组的每个元素都是一个指针,且这些指针指向相同数据类型的变量。原创 2023-06-22 20:20:08 · 2034 阅读 · 0 评论 -
指针和数组--指针和二维数组的关系
例如,a[0]可以看出是由元素a[0][0]、a[0][1]、a[0][2]和a[0][3]这4个整型元素组成的一维数组的数组名,代表该一维数组的第一个元素a[0][0]的地址(&a[0][0]),a[0]+1则代表元素a[0][1]的地址(&a[0][1])。由于p代表数组的第0行0列的地址,而从数组的第0行第0列寻址到数组的第i行第j列,中间需跳过i×n+j个元素,因此,p+i*n+j代表数组的第i行第j列的地址,即&a[i][j],*(p+i*n+j)都表示a[i][j]。所以,p的类型被表示为。原创 2023-06-20 15:00:33 · 1189 阅读 · 0 评论 -
指针与数组---指针与一维数组的关系
例如,*a或*(a+0)表示取首地址a所指的存储单元中的内容,即元素a[0],*(a+0)表示取出首地址a所指的存储单元中的内容,即元素a[0],*(a+i)表示取出首地址元素后第i个元素的内容,即下标为i的元素a[i]。相应地,数组的首地址也就确定了。由于指针变量p指向数组的首地址&a[0],所以*p表示取出p所指向的内存单元中的内容,即元素a[0]的值,p+1指向当前指针所指元素的下一个元素,p+i指向当前指针下面的第i个元素,*(p+i)表示取出p+i所指向的内存单元中的内容,即元素a[i]的值。原创 2023-06-18 10:32:33 · 1094 阅读 · 0 评论 -
字符串--字符串处理函数、向函数传递字符串
再如,字符串“Hello China”大于字符串“Hello”,即strcmp(“Hello China”,“Hello”)的函数值大于0,这是因为’\0’的ASCII码值为0,其是ASCII码表中ASCII码值最小的,所以若一个字符串是另一个字符串的子串,即字符串中前面的字符都相同,那么长的字符串一定大于短的字符串。注意:程序37~39行的字符串赋值操作不同于单个字符的赋值操作,对单个字符进行赋值操作可以使用赋值运算符,但是赋值运算符不能用于字符串的赋值操作,字符串赋值只能使用函数strcpy()。原创 2023-06-15 11:20:44 · 2230 阅读 · 0 评论 -
字符串--const类型限定符、字符处理函数(修改首字母的大小写)、数值字符串向数值得转换
通过采用指针或数组作函数参数,可使调用者获得修改后的数据,但有时我们只希望将数据传到被调函数的内部,而并不希望它们在函数内被修改,此时,为了防止数据被意外修改,也为了让函数功能更明确(明确表示程序员的意图,不希望它们被修改),可使用const对参数进行限定。由于p是一个常量指针,是只读的,其值是不可被修改的,所所以在执行程序中不能修改指针p,让他指向其他变量。虽然这里*p的值是不可修改的,但p指向的变量a的值仍是可以修改的,即对a执行赋值操作是合法的。它表明p和*p都是一个常量,都是只读的。原创 2023-06-17 10:41:43 · 493 阅读 · 0 评论 -
字符串--从函数返回字符串指针
这里mystrcat是函数名,因为()在C语言中具有最高的优先级,所以mystrcat将首先与()结合,表示mystrcat()是一个函数,他有两个形参dststr和srcstr,*号作为一元运算符比()得优先级稍低,所以他说明函数得返回值是一个字符指针。函数之间的握手(信息交换)是通过函数参数和返回值来实现的。一种常见的方法是利用数组或者指针作为函数参数,通过传地址调用来获得这些数据值,另一种方法就通过返回指针值得函数来返回一个地址值,即只想存储器这些数据的一段连续内存空间得首地址,从而获得这些数据值。原创 2023-06-17 08:37:20 · 685 阅读 · 0 评论 -
字符串--字符指针、字符串的访问和输入/输出(字符串空格问题,输入带双引号的字符串)
其实,在前面几个程序都存在一种容易被忽略的问题,即如果用户没有听从括号内的提示信息的指示,键入的字符数超过了数组name的大小12,那么多出来的那些字符就有可能重写内存的其他区域,导致程序出错。例如,在前面定义的字符数组str中,str[0]就表示第1个字符’H’,str[1]表示第2个字符’e’,依此类推,可以通过下标为i的元素str[i]来访问存放于数组中的第i+1个字符。因为数组名是一个地址常量,所以str的值是不可修改的,但ptr的值(即ptr的指向)可以被修改,ptr所指向的字符串也可以被修改。原创 2023-06-13 12:30:12 · 6494 阅读 · 0 评论 -
字符串--字符串字面量、字符串的存储
一个字符串可以存于字符数组中,但一个字符型数组中存储的并非一定是一个字符串,这要看它的最后一个元素是否为’\0’ ,字符数组是由字符构成的数组,仅当其最后一个元素为’\0’ 时才表示字符串。按这种方式定义和初始化数组,不必指定数组地大小,也不必单独为数组中地每个元素进行初始化,编译系统会根据字符串中字符地个数来确定数组地大小,由于字符串字符量“Hello”地末尾字符是’\0’ ,因此数组的大小为字符串中实际字符地个数加1。通常,将一个字符串存放在一维字符数组中,将多个字符串存放在二维字符数组中。原创 2023-06-11 11:19:36 · 2783 阅读 · 0 评论 -
指针--按值调用与模拟按引用调用,非法访问内存
指针变量的一个重要应用就是用作函数参数,指针作函数参数时,虽然实际上也是传值给被调函数(C语言中的所有函数调用都是按值调用),但是传给被调函数的这个值不是变量的值,而是变量的地址,通过向被调函数地址传递某个变量的地址值可以再被调函数中改变主调函数中的这个变量的值,相当于模拟了C++语言中的按引用调用,因此称为。程序在函数Fun()中的第二行(bar=2)改变了形参的值,并在main中调用了Fun()函数后再次输出实参的值,由程序的运行结果可以看出,函数形参值得改变并未影响实参得改变。原创 2023-06-08 15:55:40 · 976 阅读 · 0 评论 -
指针--用指针变量作函数参数的实例(按值调用与模拟按引用调用)、函数指针及其应用
这里,*compare两侧的圆括号必不可少,他将 * 和compare先结合,表示compare是一个指针变量。在前面我们了解到一个数组名其实就是存储数组第一个元素得内存地址,同理,一个函数名就是这个函数得源代码在内存中得起始地址,编译器将不带()得函数名解释为该函数得入口地址,函数指针在某些场合是非常有用的。由于指针形参所指向的变量的值在函数调用结束后才能被确定,因此这两个指针形参称为函数的出口参数,函数FindMax()的前三个形参再函数调用前必须确定其值,因此称为函数的入口参数。原创 2023-06-10 12:36:02 · 1450 阅读 · 0 评论 -
位(bit)、字节(byte)、字(word)
在计算机中作为一个整体被存取、传送、处理的二进制数字符串叫做一个字或单元,每个字中二进制位数的长度,称为字长。一个字由若干个字节组成,不同的计算机系统的字长是不同的,常见的有8位、16位、32位、64位等,字长越长,计算机一次处理的信息位就越多,精度就越高,字长是计算机性能的一个重要指标。如果一台计算机的字长是另一台计算机的两倍,即使两台计算机的速度相同,在相同的时间内,前者能做的工作是后者的两倍。比特是表示信息的最小单位,是二进制数的一位包含的信息或2个选项中特别指定1个的需要信息量。原创 2023-06-04 22:30:02 · 4903 阅读 · 0 评论 -
指针--指针变量的定义和初始化
指向某变量的指针变量,通常称为某变量的指针,虽然指针变量中存放的是变量的地址值,二者在数值上相等,但在概念上变量的指针并不等同于变量的地址。而变量的指针是一个变量,其值是改变的。:定义一个可以指向整型数据1的指针变量pa,并用整型变量a的地址值对指针变量pa进行初始化,从而使指针变量pa具体的指向了整型变量a。并且,指针变量的定义只是声明了指针变量的名字及其所能指向的数据类型,并没有说明变量究竟指向了哪里。其中,类型关键字代表指针变量要指向的变量的数据类型,即指针变量的基类型(Base Type),原创 2023-06-05 11:50:53 · 2357 阅读 · 0 评论 -
向函数传递二维数组
纵向的列表表示的是哪一门课程的成绩,横向的行表示的是哪个学生的成绩。因此,为了明确表示表格中的数据(除最后两行两列的统计数据外)必须使用两个下标:第一个下标用于表示学生的学号(即元素所在的行),第二个下标用于表示课程的编号(即元素所在的列)。在调用这4个函数时,都需要将存储n个学生的三门成绩的二维数组传给函数,这里仍然采用了“传地址调用”的方法,即用数组名作为函数的参数,实际传送的是数组的首地址。(1)函数ReadScore()用于从键盘输入学生的学号及其三门课的成绩。(我只进行了简单的演示)原创 2023-06-04 10:16:41 · 306 阅读 · 0 评论 -
指针--间接寻址运算符
2、*作为间接引用运算符,用于读取并显示指针变量中存储的内存地址所对应的变量值,即指针变量所指向的变量的值,这两种用法之间其实并无关系。的话,那么变量a所占的存储单元就好比抽屉A,指针变量p所占的存储单元好比是抽屉B,抽屉B中放着抽屉A的钥匙,直接寻址好比直接在抽屉A中放取东西,而间接寻址好比先到抽屉B中取抽屉A的钥匙,然后打开抽屉A,往抽屉A中放取东西。通常,只要指明要访问的变量的内存地址,即可直接访问变量所在的存储单元中的内容。pa这样的表达式得到指针变量pa所示的变量a的值了,因此输出。原创 2023-06-07 11:21:23 · 1404 阅读 · 0 评论 -
排序与查找(数组)
在主函数中调用函数DataSort()时,使用了数组名score作为函数的实参,实际上是将实参数组score的首地址传给了函数相应的形参,于是形参数组和实参数组共享一段存储单元。例题:从键盘输入某班学生某门课的学号和成绩(假设每班人数最多不超过40人),当输入为负值时,表述输入结束,试编程从键盘输入任意一个学号,查找该学号学生的成绩。在数组总搜索一个特定元素的处理过程,称为查找(Searching)。例题:在上述例题的基础上,改用折半查找法实现学生成绩的查找,假设按学生的学号从小到大的顺序输入学生的成绩。原创 2023-05-26 13:23:22 · 491 阅读 · 0 评论 -
指针--变量的内存地址
内存中的地址都是按字节编号的,即内存中每个字节的存储单元都有一个地址,在程序编译或函数调用时,根据程序中定义的变量类型为变量分配相应字节数的存储空间。变量在内存中所占存储空间的首地址,称为改变量的地址(Address),而变量在存储空间中存放的数据,称为变量的值(Value)。前面我们已经了解到,C程序中变量的值都是存储在计算机内存特定的存储单元中的,内存中的每个单元都有唯一的地址,就像街区中的房子一样都有唯一的地址、宾馆中的房间都有唯一的编号一样。变量a、b、c、在内存中的存储位置如下所示。原创 2023-06-04 22:33:10 · 560 阅读 · 0 评论 -
排序(例题,键入学号,成绩)
例题:要求输入学生成绩的同时输入学生的学号,并且将学生的学号随分数排序结果一同输出。原创 2023-05-26 13:23:35 · 140 阅读 · 0 评论 -
向函数传递一维数组,输入成绩
注意:数组做函数形参时,数组的长度可以不出现再数组名后面的方括号内,通常用另一个整形形参来指定数组的长度。因此,数组名后方括号内的数字并不能真正表示接收的数组的大小,向函数传递一维数组时,最后同时再用另一个形参来传递数组的长度,例如例子中的函数Average()和ReadScore()将数组得首地址传给被调函数后,形参与实参数组因具有相同得首地址而实际上占用得是同一段存储单元,根据这个首地址就可以准确计算出实参数组中每个元素得存储地址,于是在被调函数中就可以通过间接寻址方式读取或者修改这个数组得元素值。原创 2023-05-08 14:06:54 · 493 阅读 · 0 评论 -
变量的作用域,生存周期:自动变量,静态变量,外部变量,寄存器变量
在C语言中,变量的生存期是由变量的存储类型说明的,变量的存储类型决定了变量的生存期,即决定变量何时“生”,何时“灭”。使用太多的全局变量,和使用太多的goto语句标号一样,都会导致程序混乱不堪,很难保证哪个变量不会被意外修改,也很难推断变量的值究竟是在哪个地方被修改的,而任何一个函数对它的修改都会作用到全局,同样,依赖全局变量的函数也会受此影响。区别在于他们的作用域有可能是不同的,这取决于静态变量是在哪里被访问,而在所有函数外定义的静态变量,称为全局静态变量,但是只能在本文件中调用,其他文件,无法调用。原创 2023-04-26 16:07:52 · 1768 阅读 · 0 评论 -
关于stdlib.h的函数 assert函数
srand()函数会使rand()产生一个不同的随机数。反复调用rand()函数只会生成一个相同的伪随机数;1.随机数获取函数:rand(),srand()2、assert函数(猜数字)原创 2023-04-28 17:30:33 · 49 阅读 · 0 评论 -
C语言代码风格
当然,注释并非越多越好,无意义和多余的注释如同垃圾,不但白写,还可能扰乱了读者的视线,甚至可能出现二义性,比不加注释还要糟糕。3、if、for、while、do等语句各自占一行,分支或循环体内的语句一律用“{”和“}”括起来,这样便于以后的代码维护。1、程序的分界符“{”和“}”一般独占一行,且位于同一列,同时与引用它们的语句左对齐,这样便于查看“{”与“}”的配对情况。2、采用阶梯层次对应好各层次,同层次的代码在同层次的缩进层上,即位于同一层“{”和“}”之内的代码在“{”右边数格处左对齐。原创 2023-04-30 15:05:17 · 472 阅读 · 0 评论 -
二维数组的定义和初始化
第一维(行)的下标值从0变化到2,第二维(列)的下标值从0变化到3,因此,第一个元素的下标matrix[0][0],最后一个元素为matrix[2][3]。第一维的长度代表数组每一列的元素个数,第二维的长度代表数组每一行的元素个数。按行初始化时,即使初始化列表中提供的初值个数可以少于数组元素的个数,第一维的长度声明也可以省略,此时系统自动给后面的元素初始化为0.当初始化列表给出数组全部元素的初始值时,第一维的长度声明可以省略,此时,系统将按初始化列表中提供的初值个数来定义数组的大小。原创 2023-05-05 13:59:51 · 4032 阅读 · 1 评论 -
一维数组的定义和初始化
例如,再score数组中,第1个元素为score[0],值为90,第2个元素为score[1],值为80,以此类推,第5个元素为score[4],值为95。当数组再所有函数外定义,或用static定义为静态存储类型时,即使不给数组元素赋初值,那么数组元素也会自动初始化为0,这是在编译阶段完成的。那么,系统会自动按照初始化列表中提供的初值个数对数组进行初始化并确定数组的大小,所以只给部分数组元素赋初值是,对数组的长度声明不能省略。例如,在前面的程序中,可以先定义如下数组来存储5个学生的成绩。原创 2023-04-30 21:47:58 · 163 阅读 · 0 评论 -
模块化程序设计、条件编译、模块化程序设计与多文件编程实例、自顶向下、逐步求精、模块分解的基本原则
变量声明与变量定义不同的是:对于变量声明,编译器并不对其分配内存,因为这个变量实际是在其他模块定义的,即希望这个变量的内存是在其他模块分配的,用extern 声明表示要使用在其他模块定义的变量。按照模块化程序设计的思想,无论多么复杂的任务,都可以划分为若干个子任务。模块化程序设计的好处是,可以先将模块各个击破,最后再将他们集成在一起完成总任务,这样不仅便于进行单个模块的设计、开发、调试、测试和维护等工作,而且还可以使得开发人员能够团队合作,按模块分配和完成任务,实现并行开发,有利于缩短软件开发的周期。原创 2023-04-28 17:43:03 · 1565 阅读 · 1 评论 -
函数与模块化程序设计、函数的定义、向函数传递值和从函数返回值
设计得当地函数可以把函数内部的信息(包括数据和具体操作的细节)对不需要这些信息的其他模块隐藏起来,既不能访问,让使用者不必关注函数内部是如何做的,只知道它能做什么以及如何使用它即可,从而使整个程序的结构更加紧凑,逻辑也更加清晰。使用ANSIC的库函数,必须在程序的开头把函数所在的头文件包含进来。除了功能(即函数能做什么)以外,用户最关心的是他对外的接口(即参数和返回值)的含义,至少在它的内部定义了哪些变量,使用了什么算法等细节内容(即函数是“怎么做的”)全被封装起来,用户看不到,也不必去关心,这就是。原创 2023-04-24 23:17:55 · 629 阅读 · 0 评论 -
结构化设计
1966年,C.Bohm和G.Jacopini首先证明了只有顺序、选择和循环三种基本控制结构就能实现任何“单入口、单出口”的程序,这个结构化程序设计奠定了理论基础。goto语句可以不受限制的转向程序中(同一函数中)的任何地方,是程序流程随意转向,如果使用不当,不仅有可能造成不可达语句,而且还会造成程序流程混乱,影响程序的可读性。结构化程序设计是一种进行程序设计的原则和方法,按照这种原则和方法设计的程序具有结构清晰、容易阅读、容易修改、容易验证等特点。c、无不可达语句,即不存在永远执行不到的语句。原创 2023-04-23 17:27:23 · 176 阅读 · 0 评论