二维数组指针字符串.ppt_第1页
二维数组指针字符串.ppt_第2页
二维数组指针字符串.ppt_第3页
二维数组指针字符串.ppt_第4页
二维数组指针字符串.ppt_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、二维数组、指针、字符串,数组,数组是由若干相同数据类型的数据所组成的有序集合。 数组的声明 int a7; 数组的操作: ai,a,0 1 2 3 4 5 6,二维数组,二维表 数表(数阵,矩阵) 1 2 3 4 5 6,1.二维数组的定义: 数据类型 数组名常量表达式常量表达式 例: int a34; 定义了一个3*4(3行4列)的数组。 注意: 不能写成 int a3,4;的形式。 int a3,4;定义的是一维数组;数组的标志是,每一个代表一维,C+采用这样的定义方式,使我们可以把二维数组看作是一个特殊的一维数组:它的元素又是一个一维数组。(即把二维数组的每行看作一个元素) 例: int

2、 a34; 可以把a看成一个一维数组,它有3个元素a0、a1、a2,每个元素又是含4个元素的一维数组。见下图。 a0 - a00,a01,a02,a03 a a1 - a10,a11,a12,a13 a2 - a20,a21,a22,a23 此时, a0、a1、a2相当于3个一维数组的名字,上面定义的二维数组可以理解为定义了3个一维数组,即相当于 int a0 4,a1 4, a2 4; C+的这种处理方法很方便,我们在后面会体会到,C+语言中,二维数组中元素在计算机内存中的存放顺序是:按行存放,即先在内存中存放第一行的元素,再放第二行的元素(第一维变化慢,第二维变化快)。 例:int a34

3、; 二维数组a在内存中的存放顺序为 a00,a01,a02,a03,10,a11,a12,a13,a20,a21,a22,a23,2 二维数组元素的引用 数组名下标下标 注意:每维下标从0开始;下标不要超过各维的大小。 例:int a34; 第1行第2列的元素是a01 (也可说成第1行的第2个元素是a01) a23是第3行的第4个元素 a33违法,3 二维数组的初始化 对于二维数组有下列初始化方法: (1)分行给二维数组赋初值,如: int a34=1,2,3,4,5,6,7,8,9,10,11,12; 这种赋值方法比较直观,把第一对括号内的数值赋给第一行的元素,第二括号内的数值赋给第二行的元

4、素,依此类推。,(2)可以将所有数据写在一个花括号内,这时,计算机自动按数组元素在内存中的排列顺序对各元素赋初值。 例:int a34=1,2,3,4,5,6,7,8,9,10,11,12; (3)可以只对数组中部分元素初始化。如: int a34=1,5,9; 此处的作用表示:a00元素被赋成1,a10元素被赋成5,a20元素被赋成9,而数组中的其他元素被初始化为0(与一维数组的初始化机制相同) (4)如果对二维数组的全部元素初始化,则定义数组时第一维长度可以省略,但第二维长度不能省,如:分行进行初始化,如: int a4=0,0,3,0,10; char c10=C,p,r,o,g,r,a

5、,m,0;,4 二维数组的赋值、输入、输出 使用二重循环,对每个元素赋值、输入和输出: for(int i=0;iaij; aij*=ai j; coutaijendl; ,例题1 矩阵的行列互换 将一个二维数组的行列互换,存到另外一个二维数组中。例如: a= 1 2 3 行列互换后放在数组b中,b= 1 4 4 5 6 2 5 3 6,例题2 河图 将19填到九宫格中,使得横竖斜三个方向的三个数之和均为15,int main() for(int i=1;i=9;i+) for(int j=1;j=9;j+) a11=5; a00=i; a01=j; a02=15-i-j; a22=15-5-

6、i; a12=15-a02-a22; a10=15-5-a12; a20=15-i-a10; a21=15-a20-a22; if (check() print(); return 0; ,int check() int flag10=0,0,0,0,0,0,0,0,0,0; for(int i=0;i0) ,多维数组,有了二维数组的基础,再掌握多维数组是不困难的。例如,三维实数数组定义为: 数据类型 数组名常量表达式常量表达式常量表达式; double a234 定义了三位数组,共2*3*4=24个元素。多维数组在内存中的排列顺序类似于二维数组,第一维的下标变化最慢,最右边的下标变化最快。

7、a000,a001,a002,a003,a010,指针,变量的地址,内存空间的访问方式 通过变量名访问 通过地址访问 取地址运算符: 则 static int *i_pointer= 指向整型变量的指针,概念 指针:内存地址,用于 间接访问内存单元 指针变量: 用于存放地址的变量,引用 例1: i=3;/直接访问 例2: *i_pointer=3;/间接访问,变量的指针就是变量的地址;用来存放变量的地址的变量是指针变量。指针变量有时简称为指针。 指向:用地址访问变量(间接访问)。 指针运算符 * 例 int a=5; int *p = ,定义指针变量,定义指针变量的一般形式为: 存储类型 数据

8、类型 *指针变量名 例如: int *p1;/p1是指向整形数据的指针变量 static int *p2; char *da;/da是指向字符形数据的指针变量 指针变量名是p1,而不是*p1; 定义变量时,在变量名前加一个*表示该变量是指针变量 数据类型* 是指针(变量)的类型 存储类型 数据类型是指针变量的基类型 在定义指针变量时必须指定基类型(指针的运算),指针变量的初始化和赋值,语法形式 存储类型 数据类型 *指针变量名地址; 指针变量名地址 例: int a,b; int *pa= 注意事项 “地址”中存放的数据类型与指针类型必须相符。 向指针变量赋的值必须是地址常量或变量,不能是普通

9、整数。但可以赋值为整数0,表示空指针。,编程序:用指针交换两个变量的值,指针变量的引用,在C+语言中有两个有关指针的特别运算符: int *p= p=,把数组的地址赋予指向相同数据类型的指针。例如: char a10, *pa; pa=a; 此外,还经常使用下列赋值运算: int *p, *q, n; p=q+n; p=q-n; p+=n; p-=n;,指针与数组,指向数组元素的指针 声明与赋值 例: int a10, *pa; pa= 通过指针引用数组元素 经过上述声明及赋值后: *pa就是a0,*(pa+1)就是a1,. ,*(pa+i)就是ai. ai, *(pa+i), *(a+i),

10、 pai都是等效的。 不能写 a+,因为a是数组首地址是常量。,指针与数组,要访问或使用一个数组元素,可以用三种不同的方法。一种是下标法,另一种是地址法,还有一种是指针法。 1. 下标法 这种方法在前面已学习过,即指出数组名和下标值,系统就会找到该元素。数组用其下标变化实行对内存中的数组元素进行处理。,例如,程序中说明了一个数组: int a5; 则编译系统在一定的内存区域为该数组分配了存放int型数据的5个连续存储空间,它们分别是a0,a1,a4 。则ai表示从数组存储首地址开始的第i个元素变量。在程序中通过i的变化就可以处理数组中的任何元素。ai就是用下标法表示的数组元素。,2. 地址法

11、前面已经介绍,一个数组名代表它的起始地址。地址法即通过地址访问某一数组元素。 例如,程序中说明了一个数组: int a5; 则a的值就是数组的起始地址,即a指向a0,a+1指向a1,。同样,a+i是ai的地址,通过a+i的地址可以找到ai元素,即*(a+i)就是ai。,例如:要访问数组元素a3,下面两种方式是等价的: a3 下标法 *(a+3)地址法 从另一个角度来看,a+i和 并且通过指针赋值运算; pa=a; 或 pa= 则指针pa就指向了数组a的首地址。这里指针的目标变量*pa就是a0。根据上节介绍的指针运算的原理,*(pa+1)就是a1,*(pa+2)就是a2。即*(pa+i)就是ai

12、 。,void指针,C+语言允许使用空类型(void)指针,即不指定指针指向一个固定的类型,定义格式为: void *p; 表示指针变量p不指向一个确定的类型数据,它的作用仅仅是用来存放一个地址。 void指针它可以指向任何类型的C+数据。也就是说,可以用任何类型的指针直接给void指针赋值。不过,如果需要将void指针的值赋给其他类型的指针,则需要进行强制类型转换。例如: int a; int *p1=,const指针,在声明指针时,还可以用关键字const进行修饰,用关键字const修饰的指针称为const指针。 const放在不同的位置表示的意义也不相同:(就近原则) (1)关键字con

13、st放在指针类型前,就是声明一个指向常量的指针。此时,在程序中不能通过指针来改变它所指向的值,但是指针本身的值可以改变,即指针可以指向其他数据。 (2)关键字const放在“*”号和指针名之间,就是声明一个指针常量(也称常指针)。因此,指针本身的值不可改变,也即它不能再指向其他数据,但它所指向的数据的值可以改变。 (3)关键字const在上述两个地方都加,则是声明一个指向常量的指针常量,指针本身的值不可改变,它所指向的数据的值也不能通过指针改变。,例1 char *name1 = John; /name1是一般指针 *name1=A; /编译正确,运行出错 例2 const char *nam

14、e1 = John; /指向常量的指针 char s=abc; name1=s; /正确,name1本身的值可以改变 *name1=1; /编译时指出错误 例3 char *const name2 = John; name2=abc; /错误,指针常量值不能改变,字符串,C+对字符串的处理方法有两种: 一种是用字符数组,这是继承自C语言的方法; 另外一种是标准模板库里的string类型,这是C+的标准方法。(注:NOI中可以使用string),字符数组,1. 字符数组的定义 用来存放字符型数据的数组为字符数组,数组中的一个元素中只能存放一个字符,整个数组可以存放一个字符串。如:char c5;

15、 2字符数组的初始化 字符数组的初始化方式同一维数组的初始化类似,如: char c5=a,b,c,d,e; char c6 =a,b,c,d,e,0; 等价于 char c6 =a,b,c,d,e;,3 字符数组的赋值 只能对字符数组的元素赋值,而不能用赋值语句对整个数组赋值。 char a5,b5=1,2,3; a=1,2,3;/错 a=b/错,4字符串和字符串结束标志 在C+语言中字符串是以0代表结束标志。 如:“C.program”是9个字符的字符串,但在内存中占10个字节,最后一个字节存放 0。 注意:字符串要用字符数组来保存,不能用一个简单的字符变量保存,另外,字符数组的初始化方式

16、也可写为: char c10=“C.program”; / char c10=“C.program”; char c10=C,.,p,r,o,g,r,a,m,0 char c10=C,.,p,r,o,g,r,a,m /字符数组多留一个空间,初始化自动填0 与char c9=C,.,p,r,o,g,r,a,m不等价,5字符串的输入、输出: (1)用cin输入 cin字符串或字符数组名; 例: char s20; cins; (2)用cout输出,格式是: cout字符串或字符数组名; 例:char s20=“This is a string.”; couts; 的输出结果为This is a s

17、tring.。 也可直接输出字符串,如:cout“This is a string” 注: 字符数组中若没有字符串结束标志,则一直输出到在内存中碰到0标志。,6.字符串处理函数 求字符串的长度 函数原型 :strlen( const char string ); 功能:计算并返回字符串的长度。 字符串复制 函数原型 : strcpy(char destination, const char source) 功能: strcpy将字符串复制到字符串变量中,该变量中原有的内容被覆盖。必须保证字符串变量的这个字符数组有足够的单元容纳字符串。 函数原型 : strncpy(char destinati

18、on, const char source, int numchars); 功能:strncpy,将字符串source中前numchars个字符拷贝到字符串destination中。,字符串连接 原型:strcat(char target, const char source);功能:将字符串source接到字符串target的后面,必须保证字符串变量空间足够。 原型:strncat(char target, const char source, int numchars);功能:将字符串source的前numchars个字符接到字符串target的后面 字符串比较 调用格式:strcmp(字符串1,字符串2) 功能:比较两者,返回值为0,则相等。为大与0,则字符串1大与字符串2;否则小于。,求子串位置 调用格式:strstr(字符串,子串); 功能:在字符串中寻找子串,如找到,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论