数组指针字符串C语言程序的设计-第4节
,3,4,5; a=array3; array3=6; void main() int array5,i ; /使用循环语句对数组的5个元素分别赋值 for (i=0; i5; i+) arrayi=i*i; /分别输出数组元素的值 for (i=0; i5; i+) cout下标为i的元素的值是: arrayiendl; C语言系统对数组的下标越界不做任何检 查,即对有n个元素的数组,既可访问下 标小于0的元素,也可访问下标大于n的元 素。当然,这样的元素是不存在的,所以 越界访问元素会,对于数组元素的访问 可以通过以下形式表示:数组名下标 int array5= 1,2给程序运行造成不可预测 的后果,所以程序员应当自己控制下标越 界的检查。 用数组来处理求Fibonacci数列问题 void main() int i; int f20=1,1; /初始化第0、1个数 for(i=2;i20;i+) fi=fi-2+fi-1; /求第219个数 for(i=0;i20;i+) /输出,每行5个数 if(i%5=0) coutendl; coutfi ; 向函数传递一维数组 当需要把一个一维数组传给一个函数时, 调用者需要把该一维数组的变量名以及数 组元素的个数传给被调函数,而被调函数 的形参应为不带数组大小的一维数组定义 以及数组元素的个数,下面我们通过一个 例子来了解向函数传递一维数组的过程。 int min ( int a, int length) int i,m=0; 问 像普通变量一样,数组定义之后,就可以 在程序中访问数组中的元素。我们只能逐 个访问其中的元素/m用于记录最小元的下 标 for (i=1; ilength; i+) if(aiam) /逐个比较数组的元素 m=i; /找出最小的元素 return m; /函数 min将返回最小 /元素的下标: void main() int array10=18,26,23,13,15,25,27, 14,29,31,tag; tag=min(array,10); /调用函数min,并将数 组 /名作为参数传给函数 cout数组中最小的元素是: arraytagendl; 简单选择排序 假设排序过程中,待排记录序列的状态为: 有序序列R1.i-1无序序列 Ri.n 第 i 趟 简单选择排序 从中选出 关键字最小的记录 有序序列R1.i无序序列 Ri+1.n 对主调函数传递的数组进行排序 void sort(iint array= 1,2,3,4,5; 初始化后数组的长度为5。 一维数组的访nt a,int length) /定义变量tag以标记当前最小元素之下标 ,/定义交换变量buffer int i,j,tag,buffer; for(i=0;ilength;i+) tag=i; /每次外循环,都将tag的值置为 /内循环处理的第一个元素的下标 /内循环的任务是找出数组中下标 /从i到length的元素的最小者 for(j=i;jaj) tag=j; /标记小元素的下标 /将当前未排好序数组的最小元素atag /和元素ai交换 buffer=atag; atag=ai; ai=buffer; void main() int array10=6,2,10,3,7,5,9,4,8,1,i; coutendl排序前数组array:; for(i=0;i10;i+)coutarrayi ; sort(array,10);/调用函数sort,并将数组array /和数组长度作为参数传递都为0,即array3=0、 array4=0。 也可以省略数组长度,例如: 给函数 coutendl排序后数组array为:; for(i=0;i10;i+)coutarrayi“ ”; /输出 排序 /后的数组array coutendl; 该程序使用的是选择排序,其思想是,第 一次从所有元素中选取最小值,与a 0交 换;第二次从剩余元素中选取最小值,与 a 1交换;直至完成整个数组的排 序。函数sort中,每轮内循环结束后tag 中存放的就是剩余元素中最小者的下标; 第i次外循环结束后,数组前i个元素就都 是已经排好序的元素。当排序完成返回主 调函数main后,主调函数的数组array就 是已经完成排序的数组,这是因为main 函数中的数组array和sort函数中的数组a 代表同一块存储空间,从本质上讲它们是 同一个数组。 用起泡法对10个数排序(由小到大)。 起泡法的思路是:将相邻两个数比较,将 大的调到后头。 起泡排序 假设在排序过程中,记录序列R0.n-1 的值为array 0=1、 array1=2、array2=3,其余没赋初值的 元素的值的状态为: 第 i 趟起泡排序 无序序列R1.n-i+1有序序列 Rn-i+2.n n-i+1 无序序列R1.n-i有序序列 Rn-i+1.n 比较相邻记录,将关 键字最大的记录交换 到 n-i+1 的位置上 void main() int a10=6,2,10,3,7,5,9,4,8,1; int i,j,t; for(j=1;j10;j+)/此处的j值表示末尾剩几 个 for(i=0;iai+1) t=ai;ai=ai+1;ai+1=t; coutthe sorted numberS :endl; for(i=0;i10;i+) coutai ; 二维数组 前面介绍的数组只有一个下标,称为一维 数组,而在实际问题中经常要处理多维的 量,需要构造二维数组或更多维的数组。 简单地说,二维数组就是具有两个下标的 数组,其元素有两个下组的部分元素赋初值。例 如: int array5=1,2,3; 初始化后前三个元素标,以标识它在数 组中的位置。数组维数的概念与几何中维 数的概念是相似的,如果说一维数组的元 素是线性排列的,只要给出一个下标就可 以确定某一特定元素。那么,二维数组就 类似于几何中的X-Y坐标系,坐标系中只 要指出X坐标和Y坐标就能确定一个点,而 要确定二维数组中的某一个元素也只需指 出元素所在的行和列。 二维数组定义 存储类型说明符 数据类型标识符 数组名 常量表达式1常量表达式2; 其中存储类型说明和数据类型说明与一维 数组相同,常量表达式1表示第一维下标的 长度,常量表达式2 表示第二维下标的长 度,两个常量表达式中不能包含变量。例 如: int array23; 定义了一个二维数组array,该数组有两行 ,每行有三个元素。 二维数组的行下标和列下标都是从0开始的 ,对于n行m列的二维数组,行下标的取值 范围为0n-1,列下标取值范围为0m-1。 二维数组的所有元素占有的内存空间是连续 的,因此只要知道数组在内存中的起始地y3=4、array4=5。 初值表元素的数量可以少于数组长度,也 就是可以只对数址 就可以很容易的算出其它元素的存储单元地 址。 array00 array01 array02 array03 array04 array10 array11 array12 array13 array14 array20 array21 array22 array23 array24 array30 array31 array32 array33 array34 二维数组的初始化 二维数组赋初值的方式有两种,一种是不 分行给二维数组所有元素赋初值,比如int array23=1,2,3,4,5,6;,另一种更直观 的方法是分行给二维数组所有元素赋初值 ,如int array23=1,2,3,4,5,6;。 同一维数组一样,二维数组也可以只给部分 元素赋初值,例如: int 进行了初始化,初始化后array 0=1、array1=2、array2=3、 arraarray23=1,2,3; 对数组前三个元素array00、array01、 array02分别赋以1、2、3,其他剩余元素 都为0。 此外二维数组还可以用分行的方法给部分元 素赋值,例如: int array23=0,2,4; 初始化后各元素的值是array00=0、 array01=2、array02=0、array10=4 、array11=0、array12=0, 对二维数组赋初值可以省略说明第一维的 长度,但是无论何种情况,都不能省略说 明第二维的长度。在给全部元素赋值时, 例如: int array23=1,2,3,4,5,6; 编译系统会根据初值个数分配相应的存储 单元。在分行给元素赋初值时,如: int array3=2,4,5,6; 编译系统也会根据所分的行数确定第一维 的长度。 二维数组ay5= 1,2,3,4,5; 该语句定义了一个包含5个整型元素的数组 array并对其的使用 对二维数组的访问同一维数组类似,也是 通过下标运算符“”和下标值来进行的。访 问的形式如下: 数组名 行下标列下标 例如: int array23= 1,2,3,4,5,6; a=array10; array10=6; 这几条语句的功能是访问数组array中,第 二行第一列的那个元素,将其值4赋予变量 a后,赋予其新值6。 求4*4二维数组各行和各列元素之 void main() int c4,r4, i,j; /定义c4存放列元素的和, / r4存放行元素的和 int array44= 1,2,3,4,5,6,7,8, 9,10,11,12,13,14,15,16; for(i=0;i4;i+) ri=ci=0; /初始化一维数组 . for(i=0;i4;i+) /输出行元素的和 cout“第”表; 其中,初值表用一对花括号括起,每个初 始值之间用逗号隔开。例如: int arri+1“行元素的和为: riendl; for(i=0;i4;i+) /输出列元素的和 cout“第”i+1“列元素的和为: ciendl; for(i=0;i4;i+) for(j=0;j4;j+) /将第i行第j列的元素的值加入ri ri=ri+arrayij; /将第i行第j列的元素的值加入cj ci=ci+arrayji; /一次循环就好 /或cj=cj+arrayij;多次循环才 行 二维数组名作函数的参数 主函数中初始化一个矩阵并将每个元素都 输出,然后调用子函数,分别计算每一行 的元素之和,将和直接存放在每行的第一 个元素中,返回主函数之后输出各行元素 的和。 void RowSum(int A4, int nrow) int sum; for (int i = 0; i nrow; i+) sum = 0; for(int j = 0; j 分 或全部元素赋值,一维数组的初始化的格 式是: 数据类型标识符 数组名常量表达式=初 值 4; j+) sum += Aij; cout Sum of row i is sum endl; Ai0=sum; void main(void) int i; int Table34 = 1,2,3,4,2,3,4,5,3,4,5,6; for (i = 0; i 3; i+) for (int j = 0; j 4; j+) cout Tableij ; cout endl; RowSum(Table,3); for (i = 0; i 3; i+) cout Tablei0; 指 针 指针是C+语言最主要的风格之一,也是 C+语言最重要的内容之一,利用指针变 量不仅可以有效地表示各种数据结构,也 可以用于参数传递和动态分配存储空间, rry有 10个元素,其 下标从0开始。 一维数组的初始化 数组的初始化就是在定义的同时,给部并能象汇编语言一样处理内存地址,从而 编出精练而高效的程序。指针的应用使得 C+语言具有灵活、实用、高效的特点。 在计算机中,所有的数据都是存放在存储 器中的。计算机的存储器就像一个巨大的 一维数组,每个数组元素就是一个存储单 元。一般把存储器中的一个字节称为一个 内存单元,不同的数据类型所占用的内存 单元数不等,如整型数据占4个单元,字 符型数据占1个单元,为了正确地访问这 些内存单元,必须为每个内存单元编上号 ,根据一个内存单元的编号即可准确的找 到该内存单元,内存单元的编号也叫做地 址。 关于内存地址 内存空间的访问方式 通过变量名访问 通过地址访问 地址运算符: 则 int *p; /说明p是一个指针变量,它的 值是某个整型变量的地址 float *q; /说明q是指向浮点变量的指针 变量 char f ,*r; /说明f是字符变量,r是指向字 符变量的指针变量 指针的赋值 在定义一个指针的同时也可以对它进行初始化能在方括号中用变量来表示元素 的个数,可以用符号常数或常量表达式, 如arrry10表示数组ar赋 值,通常是用一个与说明的指针具有相同类型的 变量的地址来进行赋值的。初始化赋值的形式如 下: 数据类型说明符 *指针变量名=地址; 其中地址可以是同类型变量的地址、数组的地址 或数组元素的地址。地址可以用取地址运算符 语句执行完后,变量a的地址将赋给指针变量p, 或称将指针p指向变量a 指针变量也可以在定义后赋值,如上述语 句就可以改为int a=5, *p; p= 需要注意的是,没有赋值的指针变量中存 放的是一个随机值,使用没有赋过值的指 针是相当危险的。如果要使指针变量中的 指针不指向任何存储单元,那么可以将空 指针赋给指针变量,空指针的值为0,也 可以用在stdio.h中定义的符号常量NULL 表示。 指针的访问 前面介绍的是如何对指针变量进行赋值, 对指针变量赋值后就可以对其进行访问了 。 对指针值的访问有两种形式, 一种是将一个指针的值赋给另一个指针 另一种是用指针运算符*将指针所指向的变 量的值取出用以访问。 vo值类型。对 于同一个数组,其所有元素的数据类型都 是相同的。2)数组名不能与其它变量名相 同。3)不id main() int a=10,b,*p= q=p; / 将一个指针的值赋给另一个指 针 b=*q; /用指针运算符*将指针q所指向 /的变量的值取出并赋给b coutb的值是:bendl; 以指针作为函数参数以指针作为函数参数 以地址方式传递数据(传入地址), 可以用来带回函数处理结果。 实参是数组名时形参可以是指针。 读入三个浮点数,将整数部分和 小数部分分别输出 void splitfloat(float x, int *intpart,float *fracpart) /形参intpart、 fracpart是指针 *intpart = int(x);/ 取x的整数部分 *fracpart = x - *intpart; /取x的小数部分 void main(void) int i, n; float x, f; cout Enter 1 floating 的个数, 也称为数组的长度。 对于数组定义应注意以下几点:1)数组的 类型实际上是指数组元素的取point numbers x; splitfloat(x, /变量地址做实参 cout Integer Part is n Fraction Part is f ab; pointer_1= pointer_2= cout输入的值分别是:a bendl; Swap(pointer_1,pointer_2); cout交换后的值分别是:a bq表示p处于高地址位置 ;pq表示p处于低地址位置。上述指针的 关系运算一般用于对数组的访问。 指针变量加或减一个整数i的意义是把指针 的当前位置(指向某数组元素)向前或向后 移动i个位置。例如: short array8,*p; p=array; p=p+5; 其中第二条语句将指针p指向数组array即 指向a0,第三条语句将p指向array5 名是用户定义的数组标识符,数组名 的命名规则要遵循标识符命名规则。方括 号中的常量表达式表示数组元素设p是指向数组array的指针变量,则p+i,p -i,p+,p-,p+=i等运算都是合法的。需要 注意的是,一个指针变量加(减)1并不是 简单地将原值加(减)1,而是将该指针变 量的原值(是一个地址)和它指向的变量 所占用的内存单元字节数加(减)。同样 ,指针移动i个位置不等于指针移动i个字节 。 short *p; p+; 指针p指向的地址向高地址移动了2个字节 (因为一个短整型数占2个字节 int *p; p+; 则指针p指向的地址向高地址移动了4个字 节 两指针变量相减的得到一个整数。如果两 个指针变量指向同一个数组的元素,则两 个指针变量相减所得的整数是两个指针所 指数组元素之间相差的元素个数。例如: int array10,*p,*q,n; p=array; q=p+2;n=q-p; 其中第二条语句将指针p指向数组array即 指向a0,第三条语句将p指向array2, 第四条语句将指针变量q和p相减得到的值 赋给变量n,此时变量n的值是2。 指针与0比较 指针变量可以与0比较,例如: p=0表明 存储类型说明符 数据类型标识符 数组名 常量表达式; int a5; 数组返回指针值的函数 函数名前的数据类型标识符用于表示该函 数的返回值是什么类型的,函数的返回值 可以是整型、字符型或浮点型,也可以是 指针型,这时应该将函数的返回值说明成 相应数据类型的指针,返回指n /可以写成(*pmin)(a,b) cout最小的数是:cendl; 针值的函数 定义格式如下: 数据类型标识符 *函数名 ( 形式参数说 明列表 ) 其中out请输入第二个数:b; c=pmin(a,b); /通过函数指针调用函数 mi数据类型标识符和函数名之间的*表 示该函数的返回值是指针,数据类型标识 符表示指针指向的是何种类型的指针 pmin=minx; /将该指针指向函数min / 可以写成pmin= c数据,例 如: float *fun(int a , int b); 就声明了一个返回值为单 int a,b,c; int (*pmin)(int x,int y); /定义指向函数的精度浮点型指针 的函数。 float *compute(float x,float y) return x; else return y; void main() /定义float型指针result用以返回计算结果,并 为 /其分配的空间(动态存储分配下一量时说明的一致 。 int minx(int x,int y) if(xy) 节将介绍) float *result=new float4; /将计算结果依次存入res, 例如: pfun=fun; 该函数返回值的数据类型,函数参数个数 、类型都应与定义指针变ult所指向的存储空间中 *result=x+y; *(result+1)=x-y; *(resulfun(int,int,int)就成为定义返回 指针的函数。 定义好的指针变量可以存放函数的指针t+2)=x*y; *(result+3)=x/y; return result; /返回指) ,需要注意的是,在声明指向函数的变量 时,变量名外的括号不能少。若是没有括 号,如 int *p针result void main() float a,b,*p; /定int y ,int z),则定义 函数指针变量的语句为int(*pfun)(int,int,int义float型指针p用以接受返回值 couta; coutb; p=compute(a,样函数名就代表函数的指针, 也就是函数的入口地址。 函数原型为int fun(int x,b);/调用函数,p和result指向同一内 存 if(p) /如果result申,也称之为函 数的入口地址。函数的指针与数组的指针 类似,数组名代表数组的指针,即数组的 首地址,同请的空间得到了允许 /利用指针p依次输出计算结果 cout两数的和是运行,函数本身作为程序的一部分,也要 在内存中占有一片存储区域,这个区域的 起始地址,就是函数的指针:*pendl; cout两数的差是:*(p+1)endl; cout coutendl; 函数的指针 我们知道程序只有在代码装入内存后才能 两数的积是:*(p+2)endl; cout两数的商是:*(p+3)en;j3;j+)/对矩阵每一行循环 coutp_lineij ; dl; delete p; /释放申请的内存空间 compute函数申请了l; for(int i=0;i3;i+)/对指针数组元素循环 for(int j=04个单精度浮点单元 的内存空间,并将这个空间的首地址赋给 指针变量result,计算的结果存放在这块ine2; p_line2=line3; coutMatrix test:end 存储空间内,并将指针变量返回给主调函 数main。主函数使用指针p来接受 compute返回的指针/声明整型指针数组 p_line0=line1;/初始化指针数组元素 p_line1=lresult的值,再使用p 将计算结果逐个输出,最后释放p指向的 内存空间。 动态存储分配 =0,1,0; int line3=0,0,1; int *p_line3; 到目前为止,程序中使用的变量和数组的 类型、数目和大小是在编写程序时由程序 员确定下来的,因此在程 void main() int line1=1,0,0; int line2序运行时这些数 据占用的存储空间数也是一定的,这种存 储分配方法被称为静态存储分配,静态存 储分配的 char *pc5; 声明了一个一维指针数组,其中包括5个 元素,均为指向字符类型的指针缺点是程序无法在运行时根据具 体情况灵活调整存储分配情况。C+提供 了内存空间动态管理的机制,使程。指针数组的声明方式和普通数 组相似: 数据类型说明符 *数组名常量表达式; 例如: 序在运 行过程中可以按照实际需要申请适量的内 存,使用结束后,还可以释放所申请的内 存,在程序运行过 指针数组 指针数组就是由指针组成的数组,也就是 说数组中的每个元素都是相同数据类型的 指针变量程中申请或释放的内存 单元称为堆,动态申请和释放内存的过程 称作建立和删除。 自由存储区也 for(i=0;i4;i+) cout*(*(p+n)+i) ; 称堆区,是一块可以动态管 理的内存区,C+中用指针和new运算符 来动态地申请一块内存单元,用dei; coutthe score of No.n are:endl;lete运 算符来释放被申请的内存单元。动态申请 变量空间与申请数组空间的格式略有不同 ,我们分别进ndl; void search(float (*p)4,int n) int 行讨论。 使用new运算符动态申请变量空间的格式 如下: new 数据类型标识符 (表达式um+(*p); aver=sum/n; coutaverage=avere); 数据类型标识符表示开辟的空间中存放何 种类型的数据,表达式表示对动态定义的 变量进行,aver; p_end=p+n-1; for(;p=p_end;p+) sum=s赋初值,可以省略。如果存储空 间的动态开辟成功,则返回指向那块开辟 的内存单元地址,否则返回NULLge(float *p,int n) float *p_end; float sum=0,即空指 针。例如: int *p; p=new int(2); 这两条语句的含义是,使均 分 search(score,2); /求第2个学生成绩 void avera用new运算符从 自由存储区中分配一块与int类型相适应的 存储空间,并赋初值2,然后将这个存储空 ,90,99,100,98; average(*score,12);/求12个分数的平间的首地址存入事先定义好的整型指针p, 如果分配失败,则置指针p为空指针 使用new运算符oat score34=65,67,70,60, 80,87,90,81动态申请一维连续空间格式 : new 数据类型标识符 整型表达式; 其中,数据类型标id search(float (*p)4,int n); void main() fl识符表示要申请何种数据 类型的存储空间,整型表达式表示一维数组 的长度。如果申请分配成功,返回的是数)找出并输出第i个学生的成绩。 void average(float *p,int n); vo组 的指针,失败则返回空指针NULL 。需要注 意的时候,动态开辟数组时,无法对其中的 元素进行初始平均分数,以及第n个学生的成绩。 用函数average()求总平均成绩,用函数 search (化。例如: int *parr; parr=new int 5; /申请的是长度变 量的指针变量; 用指向一维数组的指针 变量。 有一个班,3个学生,各学4门课,计算总 为5的整 型数组的存储区域 使用动态存储分配时要注意在确认分配成功 后才能使用,否则可能造地址可作函数参数传递 在用指针变量作形参以接受实参数组名传 递来的地址时,有两种方法: 用指向成严重后果;分配 成功后最好不要变动指针的值,否则在释放 这片存储时会引起系统内存管理混乱;动态 分ij=*(*(p+i)+j)en dl; 多维数组的配的存储空间不会自动释放,只能通过 delete释放。 使用delete运算符释放动态分配的变量or(p=a; p(a+10); p+) coutij; couta和数 组存储空间的形式分别如下: delete p ; / delete 指针:释放变量空间 for(i=0; i10; i+) cout*(a+i); 使用指针变量 f delete parr; / delete 指针:释放连续空间 编写程序时,动态下标 for(i=0; i10; i+) coutai; 使用数组名指针运算的开辟内存一定要有相应 的内存释放,否则会造成内存空间的浪费。 输入任意个数的数据, 然后输出用三种方法输出各元素: 使用数组名和下标 使用数组名和指针运算 使用指针变量 数组名和所有数据 void main() float *parr; /定义指针用来指向分配存储区的 不能写 a+,因为a是数组首地址是常量。 设有一个int型数组a,有10个元素。 首地 址 int i,length; /length用以记录要输入数据的个数 coutlenpa+i) 就是ai. ai, *(pa+i), *(a+i), pai都是等效的。gth; parr=new floatlength; /申请长度为length的float 数数组元素 经过上述声明及赋值后: *pa就是a0,*(pa+1)就是a1,. ,*(组if(parr) /如果内存分配成功,继续输入数 据 else coutarrayi的地址,也就是 说array+i与 pa= 或 pa=a; 通过指针引用内存分配失败endl; for(i=0;ilength;i+) cout它指向数组的 第一个元素,array的值与array0的地址 相同 用array+i可以表示请输入第i+1parri; cout你刚才输入的数据是:endl; 程序设计语言 (C) 王正杰 第四章 数组、指针与字符串 本章重点数组的定义、初始化和使用;指针的 定义、访问和运算;指针与数组和函数的联系 ;字符串与数组和指针的关系;结构体的应用 ;几种常用的算法和数据结构。 本章难点指针的定义、赋值和运算;数组、字 符串、结构体的操作以及动态存储分配。 在C中,除了前面介绍的基本类型外,还有 一种用基本类型数据按一定的规则组成的构 造类型,构造类型的每一个分量可以是一个 简单的类型变量,也可以又是一个构造类型 的变量,它们可以像简单变量一样使用。C语 言的构造类型有数组、结构体、共同体等。 指针是C语言区别于其他程序设计语言的主要 特征,指针可用于有效的表示数据之间复杂 的逻辑关系,也可用于动态分配内存,还可 以简单有效地处理数组。用来存放字符串的 数组是字符数组,除了用访问数组的方式来 操纵字符串外,我们还可以利用指针来使 用字符串。本章将介绍典型的构造类型 数组和结构体,以及与数组和结构体密 切相关的指针和字符串。 数组是具有一定顺序关系的若干相同类型 变量的集合体,组成数组的变量称为该数 组的元素。 一维数组通常用于表示由固定多个同类型 的具有线性次序关系的数据所构成的复合 数据,如向量、某个学生的各门课成绩、 学生的姓名表等。在语言中使用数组必 须先进行定义,一维数组的定义形式为: p是空指针,它不指向任何变量; p!=0表 示p不是空指针。需要再次强调的是,空 指针不同于未赋值指针,指针变量未赋值 时,它的值不确定,是不能使用的,否则 将造成意外错误。而指针变量赋0值后, 它就成为空指针,它不指向具体的变量。 int *p; int b=*p;这里没有给p赋值,就使用*p, 是绝对错误的! 指针与数组 数组名是一个不允许赋值运算的指针,这 个指针的值就是数组的起始地址,例如, 对整型一维数组array10,array就是一个 指向数组起始地址的指针,for(i=0;ilength;i+) coutparri ;/输出数组 coutendl; delete parr; /释放申请的内存空间 C语言编译系统的内存管理函数 void *malloc(unsigned int size); 其作用是在内存的动态存储区中分配一个 长度为size的连续空间。此函数的值(即“ 返回值”)是一个指向分配域起始地址的指 针(基类型为void)。如果此函数未能成功 地执行(例如内存空间不足),则返回空指 针(NULL)。 void free(void *p); 其作用是释放由p指向的内存区,使 这部分内存区能被其他变量使用。p 是调用malloc函数时返回的值。free 函数无返回值。 字 符 串 C+语言中的文字数据有两种:一种是单 个的字符,一种是字符串。在前面我们了 解到,单个的字符可以用字符变量存放。 C+中没有字符串数据类型,对字符串数 据的存放是通过字符数组或指针指向的一 块连续内存空间来实现的。 一维字符数组的定义和普通数组是类似的 ,只不过数据类型标识符为char型。如: char c10; / 定义了一个长度为10 的一维字符数组 一维字符数组初始化的常用方式是以字符 串的形式进行初始化,即将整个字符串直 接赋值给数组。例如: char c10= “hello c+”;或者 char c10=“hello c+”; 也可以不指定数组长度进行赋值,例如: char c2= “hello c+”; 字符串的结束标志 字符串总是以0作为串的结束符,因此 当把一个字符串存入一个数组时,编译系 统会自动把结束符0存入数组,并以此 作为该字符串是否结束的标志 二维字符数组 字符型的二维数组也可以看成由多个一维字符 数组组成的,所以可以用二维字符数组来存
本文详细探讨了C语言中的关键概念,包括一维数组的定义、初始化与访问,指针的赋值、运算与与数组和函数的联系,以及字符串的处理和数组指针在处理Fibonacci数列、选择排序和动态内存分配中的应用。通过实例演示,展示了如何传递一维数组给函数,以及如何使用指针有效处理数据结构。
691

被折叠的 条评论
为什么被折叠?



