二维数组指针字符串
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 在程序中要注意区分下面三种表示方法所 具有的不同意义。例如,有一个指针px ,
– px --- 指针变量,它的内容是地址量。 – *px --- 指针的目标变量,它的内容是数据。 – &px --- 指针变量占用的存储区域的地址。
px
&px
*px
• 小游戏: int a,*p=&a; • &*p &*p与p等价 • *&a *&a与a等价
• 编程序:用指针交换两个变量的值
指针变量的引用
• 在C++语言中有两个有关指针的特别运算符:
– & :为取地址运算符,&x的值为x的地址。
– * :运算符:指针运算符,或指向运算符,也 称间接运算符,*p代表p所指向的变量。 注:在指针变量的定义和指针变量的引用中都有 *p。两者形式相似,但含义不同:定义时用于 指明后面的变量名是指针变量;引用时表示指 针变量指向的变量。
}
多维数组
• 有了二维数组的基础,再掌握多维数组是不困难的。例如, 三维实数数组定义为: 数据类型 数组名[常量表达式][常量表达式][常量表达式]; double a[2][3][4] 定义了三位数组,共2*3*4=24个元素。多维数组在内存中 的排列顺序类似于二维数组,第一维的下标变化最慢,最 右边的下标变化最快。 a[0][0][0],a[0][0][1],a[0][0][2],a[0][0][3],a[0][1][0],…
指针的赋值运算
当向指针变量赋值时,赋的值必须是地址常量或 变量,不能是普通整数。指针赋值运算常见的有 以下几种形式。 • 把一个变量的地址赋予一个指向相同数据类型 的指针,例如: char a, *p; p=&a; • 把一个指针的值赋予相同数据类型的另外一个 指针,例如: int *p, *q; p=q;
– 指针 p 加上或减去 n ,其意义是指针当前指向 位置的前方或后方第 n 个数据的地址。 – 这种运算的结果值取决于指针指向的数据类型 p+n的实际操作是:(p)+n*sizeof(数据类 型); p-n的实际操作是:(p)-n*sizeof(数据类 型); 其中,(p)表示指针p中的地址值,而不是&p, sizeof(数据类型)的长度单位为字节。
• 2 二维数组元素的引用 数组名[下标][下标] 注意:每维下标从0开始;下标不要超过各维的大小。 例:int a[3][4]; 第1行第2列的元素是a[0][1] (也可说成第1行的第2个元素是a[0][1]) a[2][3]是第3行的第4个元素 a[3][3]违法
• 3 二维数组的初始化 对于二维数组有下列初始化方法: (1)分行给二维数组赋初值,如: int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; 这种赋值方法比较直观,把第一对括号内 的数值赋给第一行的元素,第二括号内的 数值赋给第二行的元素,依此类推。
• C++采用这样的定义方式,使我们可以把二维数组看作是一个特殊的 一维数组:它的元素又是一个一维数组。(即把二维数组的每行看作 一个元素) 例: int a[3][4]; 可以把a看成一个一维数组,它有3个元素a[0]、a[1]、a[2],每个元素又 是含4个元素的一维数组。见下图。 a[0] --- a[0][0],a[0][1],a[0][2],a[0][3] a a[1] --- a[1][0],a[1][1],a[1][2],a[1][3] a[2] --- a[2][0],a[2][1],a[2][2],a[2][3]
指针变量的初始化和赋值
• 语法形式 存储类型 数据类型 *指针变量名=地址; 指针变量名=地址 例: int a,b; int *pa=&a; pa=&a; pa=0;
• 注意事项
– “地址”中存放的数据类型与指针类型必须相符。 – 向指针变量赋的值必须是地址常量或变量,不能是普通整数。但 可以赋值为整数0,表示空指针。
}
int check() { int flag[10]={0,0,0,0,0,0,0,0,0,0}; for(int i=0;i<3;i++) for(int j=0;j<3;j++) { if ((a[i][j]>0)&& !flag[a[i][j]]) flag[a[i][j]]=1; else return 0; } return 1;
指针运算
指针运算是以指针变量所持有的地址值为 运算量进行的运算。因此,指针运算的实 质是地址的计算。 由于指针是持有地址量的变量这一特性, 指针的运算与普通变量的运算在种类上和 意义上都是不同的。指针运算的种类是有 限的,它只能进行算术运算、关系运算和 赋值运算。
指针变量的算术运算
• 指针与整数的加减运算(px+n,px-n)
• 例题1 矩阵的行列互换 将一个二维数组的行列互换,存到另外一 个二维数组中。例如:
a= 1 2 3 行列互换后放在数组b中,b= 1 4 456 25 36
• 例题2 河图 将1~9填到九宫格中,使得横竖斜三个方向 的三个数之和均为15
int main() { for(int i=1;i<=9;i++) for(int j=1;j<=9;j++) {
• 假设数据在内存中的存储逻辑是由前向后,那么指向后方 的指针大于指向前方的指针。对于两指针p和q之间的关系 表达式: p<q 若p指向位置在q指向位置的前方,则该表达式的结果值 为1,反之为0。 指向不同数据类型的指针之间的关系运算是没有意义的, 指针与非0整数之间的关系运算也是没有意义的。但是指 针可以和零之间进行等于或不等于的关系运算,即: p==0 或 p!=0 它们用于判断指针p是否为一空指针。
指针
变量的地址
• 内存空间的访问方式
– 通过变量名访问 – 通过地址访问
• 取地址运算符:&
例: int var; 则&var 表示变量var在内存中的起始地址
指针的概念
概念 指针:内存地址,用于 间接访问内存单元 指针变量: 用于存放地址的变量 声明 例:static int i;
内存用户数据区
• 4 二维数组的赋值、输入、输出
使用二重循环,对每个元素赋值、输入和输出: for(int i=0;i<3;i++) for (int j=0;j<4;j++)//初始化有错误吗? { cin>>a[i][j]; a[i][j]*=a[i] [j]; cout<<a[i][j]<<endl; }
a[1][1]=5; a[0][0]=i; a[0][1]=j; a[0][2]=15-i-j; a[2][2]=15-5-i; a[1][2]=15-a[0][2]-a[2][2]; a[1][0]=15-5-a[1][2]; a[2][0]=15-i-a[1][0]; a[2][1]=15-a[2][0]-a[2][2]; if (check()) { print(); return 0; } }
• 把数组的地址赋予指向相同数据类型的指针。例 如: char a[10], *pa; pa=a; • 此外,还经常使用下列赋值运算: int *p, *q, n; p=q+n; p=q-n; p+=n; p-=n;
– 指向下一个或前一个数据。 – 例如:y=*px++ 相当于 y=*(px++) (*和++优先级相同,自右向左运算)
• 指针的相减运算:(px-py) 如果两个指针px和py所指向的变量类型相同,则可以对 它们进行相减运算。px-py运算的结果值是两指针指向的 地址位置之间的数据个数。它执行的运算不是两指针持有 的地址值相减,而是按下列公式得出结果。 ((px)-(py)) / 数据长度 上式中(px)和(py)分别表示指针px和py的地址值, 所以,两指针相减的结果值不是地址量,而是一个整数。
2000 2004
3 6
变量 i 变量 j
3010
2000
static int *i_pointer=&i;
指向整型变量的指针
变量 i_pointer
引用 i_pointer 例1: i=3;//直接访问 例2: *i_pointer=3;//间接访问 2000
*i_pointer
3
2000
i
• 变量的指针就是变量的地址;用来存放变量的地 址的变量是指针变量。指针变量有时简称为指针。 • 指向:用地址访问变量(间接访问)。 p a 指针运算符 * 5 例 int a=5; int *p = &a; p a *p = 6;
(2)可以将所有数据写在一个花括号内,这时,计 算机自动按数组元素在内存中的排列顺序对各元 素赋初值。 例:int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; (3)可以只对数组中部分元素初始化。如: int a[3][4]={{1},{5},{9}}; 此处的作用表示:a[0][0]元素被赋成1,a[1][0]元素被 赋成5,a[2][0]元素被赋成9,而数组中的其他元素 被初始化为0(与一维数组的初始化机制相同) (4)如果对二维数组的全部元素初始化,则定义数 组时第一维长度可以省略,但第二维长度不能省, 如:分行进行初始化,如: int a[][4]={{0,0,3},{},{0,10}}; char c[10]={„C‟,‟p‟,‟r‟,‟o‟,‟g‟,‟r‟,‟a‟,‟m‟,‟\0‟};
此时, a[0]、a[1]、a[2]相当于3个一维数组的名字,上面定义的二维 数组可以理解为定义了3个一维数组,即相当于 int a[0] [4],a[1] [4], a[2] [4]; C++的这种处理方法很方便,我们在后面会体会到
• C++语言中,二维数组中元素在计算机内 存中的存放顺序是:按行存放,即先在内 存中存放第一行的元素,再放第二行的元 素(第一维变化慢,第二维变化快)。 例:int a[3][4]; 二维数组a在内存中的存放 顺序为 a[0][0],a[0][1],a[0][2],a[0][3],[1][0],a[1][1],a[1][ 2],a[1][3],a[2][0],a[2][1],a[2][2],a[2][3]
short *pa pa-2 pa-1 *(pa-2)
*(pa-1)
*pa
pa
pa+1
*(pa+1) *(pa+2) *(pa+3)
pa+2
pa+3
28
long *pb
pb-1
*(pb-1) pb
*pb
pb+1 *(pb+1) pb+2
*(pb+2)
29
• 指针加一Leabharlann Baidu减一运算(px++ , px--)
指针的关系运算
• 在两个指向相同类型变量的指针之间可以进行各 种关系运算。两指针之间的关系运算表示它们指 向的地址位置之间的关系。比如: int a; int *p=&a,*q=p
若上面声明的两个指针作p==q运算,其结果 为1(true),也即指针p、q指向同一个变量。两 指针相等的概念是两指针指向同一位置。
1.二维数组的定义: 数据类型 数组名[常量表达式][常 量表达式] 例: int a[3][4]; 定义了一个3*4(3行4列)的数组。
注意: 不能写成 int a[3,4];的形式。 int a[3,4];定义的是一维数组;数组 的标志是[],每一个[]代表一维
[0][0] [0][1] [0][2] [0][3] [1][0] [1][1] [1][2] [1][3] [2][0] [2][1] [2][2] [2][3]
二维数组、指针、字符串
数组
• 数组是由若干相同数据类型的数据所组成的有序 集合。 • 数组的声明 int a[7];
a
2
0
5
1
10
2
13
3
4
4
70
5
20
6
• 数组的操作: a[i]
二维数组
• 二维表
学号 语文 数学 外语
1
100
110
100
110
100
120
• 数表(数阵,矩阵)
123 456
2
6
定义指针变量
• 定义指针变量的一般形式为: 存储类型 数据类型 *指针变量名 例如: int *p1;//p1是指向整形数据的指针变量 static int *p2; char *da;//da是指向字符形数据的指针变量 • 指针变量名是p1,而不是*p1; 定义变量时,在变量名前加一个*表示该变量是指针变量 数据类型* 是指针(变量)的类型 • 存储类型 数据类型是指针变量的基类型 在定义指针变量时必须指定基类型(指针的运算)