《第四课-数组和指针》由会员分享,可在线阅读,更多相关《第四课-数组和指针(36页珍藏版)》请在金锄头文库上搜索。
1、#include int x=1,y=2;max(int x,int y)return xy?x:y;void main()int x=3;coutmax=max(x,y)endl;#include int a=100;void main()int a=200;couta,:aendl;#include #include void main()int i,j;for(i=4;i=1;i-)coutsetw(i+5) ;for(j=1;j=4;j+)cout* ;coutendl;#includeint main() int n,i,j,k,m; coutn; /输入数字金字塔数目n for(
2、i=0;in; i+) /第一层循环,控制有多少层金字塔 for(m=0;mn-i; m+) cout0; j-) cout*; /第二层循环,输出每层左半边数。 for(k=1;k=i; k+) cout*; /第二层循环,输出每层右半边数。 coutendl; /输出每层的换行。 #includeint main() int n,i,j,k,m; coutn; /输入数字金字塔数目n for( i=0;in;+i) /第一层循环,控制有多少层金字塔 for(m=0;mn-i;+m) cout0;-j) cout*; /第二层循环,输出每层左半边数。 for(k=1;k=i;+k) cout
3、*; /第二层循环,输出每层右半边数。 coutendl; /输出每层的换行。 #include#includeint main() int row,i,j,k,h; cinrow; for (i = 1;i=row;i+) for (j = 1;j=row-i;j+) coutsetw(2)=1;k-) coutsetw(2)*;/结尾不换行 for (h = 2;h=i;h+) coutsetw(2)*;/结尾不换行 coutendl;/注意在这里换行,即每打印完一行才实现换行 2.4数组和指针数组 数组是一种构造类型,它是一组具有相同数据类型的数据的有序集合,其中每个数据称为数组的元素。
4、1、数组的定义 先定义,后使用,其格式如下: 数组类型 数组名常量表达式1 常量表达式2 int score100; float matrix23; const int N=80; char chN+1; 数组元素赋初值。2、数组的初始化 int score5=54,23,3,54,35; float matrix23=2.3,3.4,7.6,3.9,7.9,9.5; 初始化列表中的数据的类型应与数组元素的类型相同,所给数据的个数不能大于数组元素的个数。 对于一维数组,如果初始化列表中的个数与数组元素的个数相同,则在定义时可以省略数组的大小。 int score=54,23,3,54,35;
5、对于二维数组,如果初始化列表中数据的个数与数组元素的个数相同,则在定义时可以省略数组第一维的大小,但是第二维的大小不能省略,系统会自动根据初始化列表中数据的个数确定第一维的大小。 float matrix3=2.3,3.4,7.6,3.9,7.9,9.5; 二维数组初始化时,按照数组元素的存储顺序对各元素赋初值,一般采用分行赋初值的方法: C+中,当数组作为函数的参数或作为字符串操作时,可以进行整体引用。其它情况不允许对数组进行整体引用,只能分别对数组的元素进行操作。数组元素相当于一个变量。数组名下标表达式数组名下标表达式1下标表达式2 float matrix3=2.3,3.4,7.6,3.
6、9,7.9,9.5; int a 34=1,2,3,4,5,6; 3、数组元素的引用#includevoid main() int a34=1,2,3,4,5,6; couta11a21a23endl;#include void main()const int COUNT=10;int arrayCOUNT;coutPlease input 10 integer number:endl;for(int i=0;iarrayi;for(i=0;ii;j-)if(arrayj-1arrayj)int temp=arrayj-1; arrayj-1=arrayj; arrayj=temp; cout
7、The result is:endl; for(i=0;iCOUNT;i+)coutarrayi,;coutendl; 例2.10:利用冒泡排序法对整型数组进行排序 指针 C+中还有一种变量,它本身不存储数据,而是存储数据存放的地址,这就是指针。指针是C+中广泛使用的一种数据类型,指针可以用于数组,用于内存访问和堆内存操作。 C+中有两个与指针相关的运算符,分别是: * 指针运算符 & 取地址运算符另外:指针还可以进行赋值运算、加减运算和比较运算等。 在计算机中,所有的数据都是存放在计算机的内存中。为了访问这些数据,计算机必须提供这些数据在内存中的位置,数据在计算机内存中的位置就称为内存地址。
8、同样,为了执行程序,程序中使用的函数也必须位于内存的某个地方,所以函数也有地址。在访问变量和函数时,我们可以直接通过函数名和变量名访问,这种方式称为“直接访问”。 还可以采用另一种称为“间接访问”的方式,将变量或函数的地址存放在另一个特殊的变量中,当要访问变量或函数时,就可以通过该特殊变量获取变量和函数的地址,然后再访问变量和函数。 由于通过地址能找到所需的变量,所以说地址“指向”该变量,因此在C+中将地址称为指针。一个变量的地址称为该变量的“指针”。用于存放地址的变量就称为指针变量。 指针变量的声明与一般变量类似,只需要在类型名后添加一个表示指针的星号“*”。如: int *pInt;(声明
9、了一个指向int型的指针变量) ( 这个语句声明了一个指针变量pInt,它可以存储int类型变量的地址。在命名指针变量时,C+通常使用p表示指针,这样很容易区分一般变量和指针变量,从而使源程序更容易理解) 在C+语言中,变量的地址是由编译器分配的,用户不会知道变量的具体地址。C+提供了一个特殊的运算符取地址运算符“&”。假设number是一个变量,则&number表示变量number的地址。使用取地址运算符就可以将一个变量的地址保存到指针变量中。 间接运算符“*”与指针变量一起使用。在使用变量时,可以直接访问其中存储的数据,而通过指针变量访问数据时,首先需要获取指针变量中存储的数据地址,然后再
10、根据该地址访问数据,这也就是为什么称为间接运算符。 #include void main()int a,b,*p1=&a,*p2=&b;coutab; cout*p1 *p2endl;couta bendl;cout&a &bendl;coutp1 p2endl;coutp1-p2endl;coutp2+1endl; 指针与数组的关系 指针变量即然可以存储变量的地址,当然也可以存储数组和数组元素的地址。实际上,数组名本身就是一个常量指针,它始终保存数组在内存中的首地址。如下语句: int a5; int *p=a;表示数组中第i个元素的方法有: ai,*(a+i),*(p+i),pi #inc
11、lude void main()int a=1,3,5,7,9;int sum=0,*pa=a;for(int i=0;i5;i+)sum=sum+*pa;pa+;coutsum=sumendl; 使用指针法引用数组元素是基于指针变量的算术运算。指针变量只能进行加、减算术运算。 对一个指针变量加一个整数值后,其结果仍然一个地址。从指针变量中减去一个整数后,其结果也是一个地址。 对指针变量的算术运算采用一种特殊的方式,假设指针变量pArray保存数组的地址,给指针变量pArray加1后,该指针变量将保存数组中下一个元素的地址。由于数组是double型,每个元素占8个字节,则pArray+1意味着
12、pArray的值加8个字节,以使它指向下一个元素。 C+将一个二维数组当作多个一维数组来处理, 所以一个a23的数组则可以被分解为两个一维数组使用。 int b34; 表示元素bij的形式有:bij,*(bi+j),*(*(b+i)+j) (*(b+i)j等。 二维数组可以看成是元素为一维数组的一维数组,因此 b是指向一维数组的常量指针。若有定义下列语句: int b34,*pb;则pb=b;是错误的; c+中提供了指向数组的指针,格式如下: 数据类型 (*指针名)常量表达式; 常量表达式规定了指针所指向一维数组的长度; int (*pb)4; 2.4.4 动态内存分配 前面声明的变量和数组都
13、是静态分配的。也就是在编译时为数据分配内存空间,当程序执行时所需的内存已经分配好。这种分配方式存在两个问题:1、如果事前分配了1000个单词的存储空间,但在程序的运行过程中实际没有1000个单词,这会造成内存空间的浪费。2、如果试图存储1001个单词,则静态分配的内存又会不足。 动态内存分配 在程序的执行过程中,根据需要分配内存。 动态分配的内存变量不能在编译期间声明,即不能在源程序中使用变量指定,这就需要使用其他方式标识分配的内存地址。很显然,存储该地址的惟一方式就是使用指针变量。new和delete运算符1、new运算符 用于向系统申请内存空间,并返回该内存空间的首地址; 指针=new 数
14、据类型 “数据类型”表示分配的内存空间存放数据的类型,系统根据数据类型的大小分配相应大小的内存空间,它可以是任意合法的数据类型。指针的类型必须与new后的数据类型相同,否则应进行强制类型转换。 double *p=new double; 在分配内存空间时,可以对分配的内存空间进行初始化,格式如下: 指针=new 数据类型(表达式); 系统用表达式的值初始化分配的内存空间。 new运算符可以为数组申请内存空间,建立动态数组:1、一维数组申请存储空间格式: 指针=new 数据类型(整型表达式); 为数组分配存储空间时,不能进行初始化。 int n=5;int *p=new intn+1; 2、二维
15、数组申请存储空间格式: 指针=new 数据类型表达式常量表达式; 第一维的大小可以是任意合法的表达式,第二维的大小必须是常量表达式。如: int n=5;int (*p)4=new intn4; 多维数组申请存储空间格式: 指针=new 数据类型表达式常量表达式1常量表达式2. 第一维的大小可以是任意合法的表达式,其它维的大小必须是常量表达式。 使用new动态分配内存时,如果系统没有足够的存储空间满足申请要求,或由于其它原因造成分配内存失败,new将返回空指针(null),因此通常应对内存的动态分配是否成功进行检查:int *p=new int;If(!p) cout“allocation f
16、ailure”endl;Return; 2、delete运算符 由new动态分配的存储空间在使用结束后一定要释放,否则会造成内存泄漏。运算符delete用于释放使用new动态分配的存储空间,它的一般使用格式为: delete 指针其中:“指针”必须是new分配空间的首地址。释放动态分配的数组存储空间时,应使用如下格式: delete 指针其中:“指针”必须是动态数组的首地址。每次使用new运算符后,都有相应的delete运算符。例:从键盘输入若干个整数存入数组并求这些整数的和。 #include void main() int count,sum=0;coutcount;int *p=new
17、intcount;if(!p)coutallocation failureendl;return;coutplease input-count-integer numbers:endl;for(int i=0;i*(p+i);sum=sum+*(p+i);coutsum=sumendl;delete p; #include void main() int count,sum=0;coutcount;int *p=new intcount;if(!p)coutallocation failureendl;return;coutplease input-count-integer numbers:
18、endl;for(int i=0;i*p;sum=sum+*p;p+;coutsum=sumendl;delete p; 例:使用指针,实现以下功能:输入三个整数,按照从大到小的顺序输出,使用指针变量进行交换。#include void swap(int *x,int *y) int t; t=*x; *x=*y; *y=t;int main()int a,b,c;int *pa,*pb,*pc;pa=&a;pb=&b;pc=&c;cinabc;cout输入数顺序为:*pa,*pb,*pcendl;if(*pa*pb) 例:使用指针,实现以下功能:输入三个整数,按照从大到小的顺序输出,使用指针
19、变量进行交换。swap(pa,pb);if(*pa*pc)swap(pa,pc);if(*pb*pc)swap(pb,pc);cout排序后数据为:*pa,*pb,*pcendl;return 0; 例:求出下列程序的运算结果#includeint k=56;void f1(int &a,int &b)couta,bendl;a+=10;b+=20;int &f2(int &a,int &b)coutin f2:a+b=a+bendl;if(a+b)%2=0) return a;else return b;void main()int x=1,y=2,z=3,k=4,w=0;f1(x,y);coutx,yendl; coutz,k,wendl;w=f2(z,k)+;coutz,k,wendl;w=f2(z,k)+;coutz,k,wendl; #includevoid print(int),print(char),print(char *);void main()int m=2000;print(m);print(m);print(good);void print(char x)coutxendl; void print(int x)coutxendl; void print(char *x)coutxendl;