《二维数组指针字符串.ppt》由会员分享,可在线阅读,更多相关《二维数组指针字符串.ppt(54页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、二维数组、指针、字符串数组数组是由若干相同数据类型相同数据类型的数据所组成的有序有序集合。数组的声明 int a7;数组的操作:ai25101347020a 0 1 2 3 4 5 6二维数组二维数组二维表 数表(数阵,矩阵)1 2 3 4 5 6学号 语文 数学 外语110010010021101101201.二维数组的定义二维数组的定义:数据类型 数组名常量表达式常量表达式 例:int a34;定义了一个3*4(3行4列)的数组。注意注意:不能写成 int a3,4;的形式。int a3,4;定义的是一维数组;数组的标志是,每一个代表一维000102031011121320212223C+
2、采用这样的定义方式,使我们可以把二维数组看作是一个特殊的采用这样的定义方式,使我们可以把二维数组看作是一个特殊的一维数组:它的元素又是一个一维数组一维数组:它的元素又是一个一维数组。(即即把二维数组的每行看作一个元素)例例:int a34;可以把a看成一个一维数组,它有3个元素a0、a1、a2,每个元素又是含4个元素的一维数组。见下图。a0 -a00,a01,a02,a03a a1 -a10,a11,a12,a13 a2 -a20,a21,a22,a23 此时,a0、a1、a2相当于3个一维数组的名字,上面定义的二维数组可以理解为定义了3个一维数组,即相当于 int a0 4,a1 4,a2
3、4;C+的这种处理方法很方便,我们在后面会体会到 C+语言中,二维数组中元素在计算机内存语言中,二维数组中元素在计算机内存中的存放顺序是:按行存放,即先在内存中的存放顺序是:按行存放,即先在内存中存放第一行的元素,再放第二行的元素中存放第一行的元素,再放第二行的元素(第一维变化慢,第二维变化快第一维变化慢,第二维变化快)。例:int a34;二维数组a在内存中的存放顺序为a00,a01,a02,a03,10,a11,a12,a13,a20,a21,a22,a232 二维数组元素的引用二维数组元素的引用 数组名下标下标注意:注意:每维下标从0开始;下标不要超过各维的大小。例:int a34;第1
4、行第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;这种赋值方法比较直观,把第一对括号内的数值赋给第一行的元素,第二括号内的数值赋给第二行的元素,依此类推。(2)可以将所有数据写在一个花括号内,这时,计算机自动按数组元素在内存中的排列顺序对各元素赋初值。例:int a34=1,2,3,4,5,6,7,8,9,10,11,12;(3)可以只对数组中部分元素初始化。如:int a34
5、=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,m,0;4 二维数组的赋值、输入、输出二维数组的赋值、输入、输出 使用二重循环使用二重循环,对每个元素赋值、输入和输出:对每个元素赋值、输入和输出:for(int i=0;i3;i+)for(in
6、t j=0;jaij;aij*=ai j;coutaijendl;例题1 矩阵的行列互换 将一个二维数组的行列互换,存到另外一个二维数组中。例如:a=1 2 3 行列互换后放在数组b中,b=1 4 4 5 6 2 5 3 6例题2 河图 将19填到九宫格中,使得横竖斜三个方向的三个数之和均为15int 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-i;a12=15-a02-a22;a10=15-5-a12;a20=15-i-a10;a21=15-a20-a22;if(check
7、()print();return 0;int check()int flag10=0,0,0,0,0,0,0,0,0,0;for(int i=0;i3;i+)for(int j=0;j0)&!flagaij)flagaij=1;else return 0;return 1;多维数组多维数组有了二维数组的基础,再掌握多维数组是不困难的。例如,三维实数数组定义为:数据类型 数组名常量表达式常量表达式常量表达式;double a234 定义了三位数组,共2*3*4=24个元素。多维数组在内存中的排列顺序类似于二维数组,第一维的下标变化最慢,最右边的下标变化最快。a000,a001,a002,a003
8、,a010,指针变量的地址内存空间的访问方式通过变量名访问通过地址访问取地址运算符:&例:int var;则&var 表示变量var在内存中的起始地址指针的概念声明声明例:static int i;static int*i_pointer=&i;指向整型变量的指针概念概念指针:指针:内存地址,用于 间接访问内存单元指针变量:指针变量:用于存放地址的变量20003i_pointer*i_pointeri2000内存用户数据区变量 i变量 j变量 i_pointer362000200020043010引用引用例1:i=3;/直接访问例2:*i_pointer=3;/间接访问变量的指针就是变量的地址
9、;用来存放变量的地址的变量是指针变量。指针变量有时简称为指针指针变量有时简称为指针。指向:用地址访问变量(间接访问)。指针运算符*例 int a=5;int*p=&a;*p=6;pa5pa6定义指针变量定义指针变量的一般形式为:存储类型存储类型 数据类型数据类型 *指针变量名指针变量名例如:int*p1;/p1是指向整形数据的指针变量 static int*p2;char*da;/da是指向字符形数据的指针变量指针变量名是指针变量名是p1,而不是,而不是*p1;定义变量时,在变量名前加一个定义变量时,在变量名前加一个*表示该变量是指针变量表示该变量是指针变量 数据类型数据类型*是指针(变量)的
10、类型是指针(变量)的类型存储类型存储类型 数据类型数据类型是指针变量的基类型是指针变量的基类型 在定义指针变量时必须指定基类型(指针的运算)在定义指针变量时必须指定基类型(指针的运算)指针变量的初始化和赋值语法形式 存储类型 数据类型 *指针变量名地址;指针变量名地址 例:int a,b;int*pa=&a;pa=&a;pa=0;注意事项“地址”中存放的数据类型与指针类型必须相符。向指针变量赋的值必须是地址常量或变量,不能是普通整数。但可以赋值为整数0,表示空指针。编程序:用指针交换两个变量的值指针变量的引用在C+语言中有两个有关指针的特别运算符:&:为取地址运算符,&x的值为x的地址。*:运
11、算符:指针运算符,或指向运算符,也称间接运算符,*p代表p所指向的变量。注:在指针变量的定义和指针变量的引用中都有*p。两者形式相似,但含义不同:定义时用于指明后面的变量名是指针变量;引用时表示指针变量指向的变量。在程序中要注意区分下面三种表示方法所具有的不同意义。例如,有一个指针px,px -指针变量,它的内容是地址量。*px -指针的目标变量,它的内容是数据。&px -指针变量占用的存储区域的地址。px&px*px小游戏:int a,*p=&a;&*p&*p与p等价*&a *&a与a等价指针运算 指针运算是以指针变量所持有的地址值为运算量进行的运算。因此,指针运算的实质是地址的计算。由于指
12、针是持有地址量的变量这一特性,指针的运算与普通变量的运算在种类上和意义上都是不同的。指针运算的种类是有限的,它只能进行算术运算、关系运算和赋值运算。指针变量的算术运算指针与整数的加减运算(px+n,px-n)指针 p 加上或减去 n,其意义是指针当前指向位置的前方或后方第 n 个数据的地址。这种运算的结果值取决于指针指向的数据类型p+n的实际操作是:(p)+n*sizeof(数据类型);p-n的实际操作是:(p)-n*sizeof(数据类型);其中,(p)表示指针p中的地址值,而不是&p,sizeof(数据类型)的长度单位为字节。papa-2pa-1pa+1pa+2pa+3*(pa-2)*pa
13、*(pa+1)*(pa+2)*(pa+3)*(pa-1)short*pa28pb-1pbpb+1pb+2*(pb-1)*pb*(pb+1)*(pb+2)long*pb29指针加一,减一运算指针加一,减一运算(px+,px-)指向下一个或前一个数据。例如:y=*px+相当于 y=*(px+)(*和+优先级相同,自右向左运算)指针的相减运算:(指针的相减运算:(px-py)如果两个指针px和py所指向的变量类型相同,则可以对它们进行相减运算。px-py运算的结果值是两指针指向的地址位置之间的数据个数。它执行的运算不是两指针持有的地址值相减,而是按下列公式得出结果。(px)-(py)/数据长度上式中
14、(px)和(py)分别表示指针px和py的地址值,所以,两指针相减的结果值不是地址量,而是一个整数。指针的关系运算指针的关系运算在两个指向相同类型变量的指针之间可以进行各种关系运算。两指针之间的关系运算表示它们指向的地址位置之间的关系。比如:int a;int*p=&a,*q=p 若上面声明的两个指针作p=q运算,其结果为1(true),也即指针p、q指向同一个变量。两指针相等的概念是两指针指向同一位置。假设数据在内存中的存储逻辑是由前向后,那么指向后方的指针大于指向前方的指针。对于两指针p和q之间的关系表达式:p字符串或字符数组名;字符串或字符数组名;例:char s20;cins;(2)用
15、cout输出,格式是:cout字符串或字符数组名;字符串或字符数组名;例:char s20=“This is a string.”;couts;的输出结果为This is a string.。也可直接输出字符串,如:cout“This is a string”注:字字符符数数组组中中若若没没有有字字符符串串结结束束标标志志,则则一一直直输输出出到到在在内内存存中中碰碰到到0标志。标志。6.字符串处理函数求字符串的长度求字符串的长度 函数原型:strlen(const char string);功能:计算并返回字符串的长度。字符串复制字符串复制 函数原型:strcpy(char destinat
16、ion,const char source)功能:strcpy将字符串复制到字符串变量中,该变量中原有的内容被覆盖。必须保证字符串变量的这个字符数组有足够的单元容纳字符串。函数原型:strncpy(char destination,const char source,int numchars);功能:strncpy,将字符串source中前numchars个字符拷贝到字符串destination中。字符串连接字符串连接 原型:strcat(char target,const char source);功能:将字符串source接到字符串target的后面,必须保证字符串变量空间足够。原型:st
17、rncat(char target,const char source,int numchars);功能:将字符串source的前numchars个字符接到字符串target的后面 字符串比较字符串比较 调用格式:strcmp(字符串1,字符串2)功能:比较两者,返回值为0,则相等。为大与0,则字符串1大与字符串2;否则小于。求子串位置求子串位置 调用格式:strstr(字符串,子串);功能:在字符串中寻找子串,如找到,返回该字符串的从子串起始处的后半部分,否则返回一空字符串。字符串输出 调用格式:cout字符串 功能:显示输出字符串字符串输入 调用格式1:cin字符串变量 功能:输入一个空白字符串的字符串。调用格式2:cin.getline(字符串变量,变量大小)功能:从键盘输入一个以Enter键标志结束的字符串。例1 输入n个字符串,要求找出其中的最大者。要求使用函数找最大者。(每个字符串长度小于30)例2:统计单词 统计一个英文句子中有多少英文单词。假设句子中字符数小于80个,单词间用至少一个空格隔开(可以有多个空格),句子头部也可以有多个空格,句子以*作为结束标志。
限制150内