数组与指针
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例:数组初始化示例 Main() { int I,a[]={3,5,9,2}; int b[4]; cout<< "array a:"; for (i=0;i<4;i++) cout<<a[i]<< " "; cout<<"\narray b:"; for (i=0;i<4;i++) cout<<b[i]<<" "; } 运行结果: array a: 3 array b: ?
0 0 0
指针
一.指针概念
指针表示某存储单元的地址。变量表示某存储单 元(既单元存储内容)。 1.存储单元的地址 计算机cpu执行的指令和处理的数据都必须先访 问内存百度文库计算机内存中每一字节都有一个标识地址, 该地址用数值表示(实际上是二进制数)。多字节连 续存储区的地址为该存储区的首字节地址。 2.指针变量 存放指针的变量,既存放某存储单元地址的存储 单元。
Main() { int i,j,a[10],tem,k; for (i=0;i<10;i++) { cout<<"输入第"<< i+1 <<"个数:"; cin>>a[i]; } for (i=0;i<=8;i++) { k=i; for(j=i+1;j<=9;j++) if (a[k]>a[j]) k=j; tem=a[i];a[i]=a[k];a[k]=tem; } for (i=0;i<10;i++) cout<<a[i]<<" "; }
有多个下标的数组。
定义形式:
多维数组
1.多维数组的定义和数组
类型 数组名[常数表达式1][常数表达式2]〃〃 [常数表达式n]
常数表达式1:结果数表示第一维。 常数表达式2:结果数表示第二维。 常数表达式n:结果数表示第n维。 元素个数:常数表达式1×常数表达式2〃〃〃〃〃〃×常
数表达式n
例:float a[2][3][4];
× int a[2][2][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};
int a[][2][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}}
例: int a[][2][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}} int i,j,k; for (i=0;i<2;i++) for (j=0;j<2;j++) { for (k=0;k<3;k++) cout<<a[i][j][k]; 1 2 3 cout<<"\n"; 0 0 0 } 4 5 6 1 2 3 0 0 0 7 8 9 0 0 0 0 0 0 4 5 6 10 11 12 0 0 0
例如: int t=5,d,*p; p=&t; 2006 t 5 2010 d ? 2014 2006 p 3.指针变量的定义 类型说明符 *变量表识符 例: int *p1,t=5; float *dr; float s; 4.取地址运算符& 例: p1=&t; dr=&s;
5.间接运算符* 例: int t=5,d,*p,*p1; p=&t; p1=p; d=*p; \\与d=t;相同 t=6; t=p;
有两个下标的数组。
二维数组
1.二维数组的定义和数组
定义形式: 类型 数组名[常数表达式1][常数表达式2] 常数表达式1:结果数表示行数。 常数表达式2:结果数表示列数。 例:float a[3][4];
a[0][0] a[1][0] a[2][0] a[0][1] a[1][1] a[2][1] a[0][2] a[1][2] a[2][2] a[0][3] a[1][3] a[2][3]
5 ?
9 ?
2 ?
例: 从键盘输入10个整数给数组,按反序显示。 Main() { int i,a[10]; for (i=0;i<10;i++) { cout<<"输入第"<<i+1<<"个数:"; cin>>a[i]; } for (i=9;i>=0;i--) cout<<a[i]; }
按反序存放: For (i=0;i<10/2;i++) { tem=a[i]; a[i]=a[9-i]; a[9-i]=tem; }
2.二维数组的引用
数组占用的连续内存字节数: 行数×列数×类型字节数; 数组a的地址为a[0][0]的首地址。 a==&a[0][0] a[i][j]的首地址为: &a[0][0]+i*列数*类型字节数+j*类型字节数;
3.二维数组元素的初始化
int a[2][3]={1,2,3,4,5,6} int a[2][3]={{1,2,3},{4,5,6}} int a[2][3]={{1,2},{4}}
a 6
p2
&b
b
b
&a
10
注意: 1)指针变量赋值时,指针数据类型应一致。 例:float y; int *z; z=&y; 例:z=(int *)(&y); 2)不允许把一个非指针数直接赋值给指针变量。 例:int *p; p=1000; 例:p=(int *)1000
3)可以给指针变量赋空值NULL。 p=NULL; 4)指针变量和变量不能直接相互赋给。 例: int a=5,*p,p1; p1=&a; *p=&a;
数组
一、数组概念
一组有序数。 例: a0 a1 a2 〃〃〃〃〃〃〃〃an 如用n个单个变量存储数组的话,声明表达、引用 都不方便。C语句有专门的数据类型存储数组。 数组要素:数组名、元素、大小、下标、数据类 型。
二、一维数组
1.一维数组的定义 类型 数组名[常数表达式] 类型:每个元素的数据类型。
a[0][0]=1,a[0][1]=2,a[1][0]=4 其他为0。
int a[][3]={1,2,3,4,5,6}; int a[][3]={1,2,3,4,5,6,7}; int a[][3]={{ },{0,5}}; 例:从键盘输入年月日,计算该日是该年的第几天。
Main() { int year,month,days,i,leap; static int mtable[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31} ,{31,29,31,30,31,30,31,31,30,31,30,31}}; cout<<"输入年 月 日:"; cin>>year>>mont>>days; leap=0; If (year%4==0 && year%100!=0 ||year%400==0) Leap=1; for (i=0;i<month-1;i++) days+=mtable[leap][i]; Cout<< " 第 " <<days<< "天" <<endl; }
2.多维数组的存储 从低维到高维的下标数升序连续排列。
a[0][0][0] a[0][1][1] a[0][2][2] a[1][0][3] a[1][2][0] a[0][0][1] a[0][1][2] a[0][2][3] a[1][1][0] a[1][2][1] a[0][0][2] a[0][1][3] a[1][0][0] a[1][1][1] a[1][2][2] a[0][0][3] a[0][2][0] a[1][0][1] a[1][1][2] a[1][2][3] a[0][1][0] a[0][2][1] a[1][0][2] a[1][1][3] ?
例 #include <iostream.h> main() { int *p1,*p2,*p,a,b; cin>>a>>b; p1=&a;p2=&b; if(*p1<*p2) {p=p1;p1=p2;p2=p} cout<<" max="<< *p1<<"min="<<*p2; }
p1
a p1 &a 6 &b p2 10
三维数组的地址为a[0][0][0]的首地址。 a==& a[0][0][0] a[i][j][k]的首地址为: a+i*第2维个数*第3维个数*4+j*第3维个数*4+k*4
a[i][j][k]的首地址为: a+i*3*4*4+j*4*4+k*4 3.多维数组的初始化 例: int a[2][2][3]={1,2,3,4,5,6,7,8,9,10,11,12}; int a[][2][3]={1,2,3,4,5,6,7,8,9,10,11}; 最后一个元素为:a[1][1][2]=0 int a[2][2][3]={{1,2,3,4,5,6},{7,8,9,10,11,12}};
例:从键盘上输入10个数, 用选择法按升序排序输 出。 选择排序法: a(0),a(1),a(2)〃〃〃a(i),〃〃〃〃〃a(n-2),a(n-1) i=0,〃〃〃〃〃〃〃〃〃〃〃n-2 j=i+1,〃〃〃〃〃〃〃〃〃〃n-1
Main() { int i,j,a[10],tem; for (i=0;i<10;i++) { cout<<"输入第"<<i+1<<"个数:"; cin>>a[i]; } for (i=0;i<=8;i++) for(j=i+1;j<=9;j++) if (a[i]>a[j]) {tem=a[i];a[i]=a[j];a[j]=tem;} for (i=0;i<10;i++) cout<<a[i]<<" "; }
合法的数组定义: int x[10]; char ch[20]; flaot score[30],f,avg[30]; #define n 10 long num[2*n]; 不合法的数组定义: int a(5); int n=10; char d[n];
2.一维数组元素的引用 引用形式: 数组名[表达式] 例7.1 将0~5输入数组中。 #include <iostream.h> main() { int a[6],i; for (i=0;i<=5;i++) a[i]=I; for (i=0;i<=5;i++) cout<<a[i]<<endl;} 数组下标越界的问题: a[6]=7;
2006 5
t
d
2006 2010
5
5 2006 2006
t d
2006 2010
6
5 2006 2006
t d p(*) P1(*)
2010
2014 2018
?
?
p(*) 2014 P1(*) 2018
p(*) 2014 P1(*) 2018
?
在vc中运行的内存映像
例: #include <iostream.h> main() { int a,b; int *p1,*p2; a=100,b=10; p1=&a;p2=&b; cout<<a<<" "<<b<<" "; cout<<*p1<<" "<<*p2; cout<<(unsigned) p1<<(unsigned) p2; } 运行结果: 100 10 100 10 ????????? ?????????
0 1 2 3 4 5 a[0] a[1] a[2] a[3] a[4] a[5]
6 i
3.一维数组的初始化 在声明数组时给数组赋初值。 1) int sz[5]={0,1,2,3,4}; 2) int sz[5]={6,2,3} sz[0]=6,sz[1]=2,sz[2]=3 3) int sz[]={2,4,3,2,1,8} 大小:6 注意:生存变量时,如果是静态变量,没赋初始 值,自动为0。其他变量没赋初值,值不确定。
数组名:标识符,标识数组。 常数表达式:计算结果值指出数组的元素个数。 例: int szb[4]; 声明了一维数组szb,每个元素的类型为int,其 中有4个元素。 每个数组的下标数从0开始,szb数组的每个元素 表示如下: szb[0]、szb[1]、szb[2]、szb[3]。 数组szb的内存结构: szb[0] szb[1] szb[2] szb[3]
数组名[表达式1][表达式2] b=a[1][2]; 例: main() { int i,j,a[2][3]; for(i=0;i<2;i++) for(j=0;j<3;j++) a[i][j]=i+j; } a[0][0]=0; a[0][1]=1;a[0][2]=2;a[1][0]=1; a[1][1]=2; a[1][2]=3;