关于二维数组的地址
- 格式:ppt
- 大小:26.00 KB
- 文档页数:8
C语言知识点总结8【二维数组】一、二维数组的定义●一个3行,4列的二维数组。
其行号:0,1,2;其列号:0,1,2,3●最大下标的元素为a[2][3],没有a[3][4]这个元素●数组共有3行,每一行都是:4个元素的一维数组,每一行的数组名分别为:a[0],a[1],a[2]●从整体看,任何一个二维数组都可以看成是一个一维数组,只不过其数组元素又是一个一维数组。
●二维数组定义同时若有初始化,可以省略行号不写:如int a[][3]={1,2,3,4,5,6};系统会按照数据的个数,和规定的列数,来确定数据分几行?●二维数组定义同时若有初始化,可以省略行号不写,但列号不能省略:如int a[3][ ]={1,2,3,4,5};系统无法按照数据的个数,和规定的行数,来确定数据分几列。
二、二维数组的存储及地址关系二维数组在计算机中的存储是按行连续存储。
先保存第一行,在第一行末尾开始存第二行,依此类推。
这里,a是a[0]的地址,a[0]是数组元素a[0][0]的地址,则a是地址的地址,即二级地址三、 二维数组的初始化1、 分行赋值:int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};2、 不分行赋值:全部数据写在一个大括号内:int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};3、 部分元素赋值4、如果对全部元素赋初值,则第一维的长度可以不指定,但必须指定第二维的长度。
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; 等价:int a[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12};四、 二维数组的输出五、二维数组的输入六、二维数组的应用案例1:计算一个二维数组的主对角线元素之和主对角线元素的特点:行号与列号相同。
选择性求和。
反对角线元素的特点:?#include<stdio.h>void main(){int a[4][4]={{1,1,1,1},{2,2,2,2},{3,3,3,3},{4,4,4,4}};int i,j;int s=0;for(i=0;i<4;i++)for(j=0;j<4;j++)if(i==j)s=s+a[i][j];printf("%4d\n",s);}案例2:一共有5名同学,参加了3门课程的考试。
《数据结构》填空作业题答案第1章绪论(已校对无误)1.数据结构包括数据的逻辑结构、数据的存储结构和数据的运算三方面的内容。
2.程序包括两个内容:数据结构和算法。
3. 数据结构的形式定义为:数据结构是一个二元组: Data Structure =(D,S)。
4. 数据的逻辑结构在计算机存储器内的表示,称为数据的存储结构。
5. 数据的逻辑结构可以分类为线性结构和非线性结构两大类。
6. 在图状结构中,每个结点的前驱结点数和后继结点数可以有多个。
7. 在树形结构中,数据元素之间存在一对多的关系。
8. 数据的物理结构,指数据元素在计算机中的标识(映象),也即存储结构。
9. 数据的逻辑结构包括线性结构、树形结构和图形结构 3种类型,树型结构和有向图结构合称为非线性结构。
10. 顺序存储结构是把逻辑上相邻的结点存储在物理上连续的存储单元里,结点之间的逻辑关系由存储单元位置的邻接关系来体现。
11. 链式存储结构是把逻辑上相邻的结点存储在物理上任意的存储单元里,节点之间的逻辑关系由附加的指针域来体现。
12. 数据的存储结构可用4种基本的存储方法表示,它们分别是顺序存储、链式存储、索引存储和散列存储。
13. 线性结构反映结点间的逻辑关系是一对一的,非线性结构反映结点间的逻辑关系是一对多或多对多。
14. 数据结构在物理上可分为顺序存储结构和链式存储结构。
15. 我们把每种数据结构均视为抽象类型,它不但定义了数据的表示方式,还给出了处理数据的实现方法。
16. 数据元素可由若干个数据项组成。
17. 算法分析的两个主要方面是时间复杂度和空间复杂度。
18. 一个算法的时间复杂度是用该算法所消耗的时间的多少来度量的,一个算法的空间复杂度是用该算法在运行过程中所占用的存储空间的大小来度量的。
19. 算法具有如下特点:有穷性、确定性、可行性、输入、输出。
20. 对于某一类特定的问题,算法给出了解决问题的一系列操作,每一操作都有它的确切的定义,并在有穷时间内计算出结果。
多维数组地址的计算方法一、二维数组若求Cl jJ2在内存中的存储位置:1・a hj2在dj〜°久+1段内的第丿・2的位置上:2・dj前共有力段,每段加个存储单元,HP:h2xj}.因此a jJ2的存储地址为(英中厶为基本类型数拯的字节数):LOC(j、9j2)= SC(0,0)+ 仮 x 人 + j2)L若求a j}j2j i在内存中的存储位置,需根据各维下标的变化分段来计算:1.当第一维下标为力时,djl前共有力段,其中每段内均可依次被划分成加段,加段又被划分成加个已不可再分的最小基本类型数据单元,因此前第“丿]段前中共有h2 xZ?3 x j}个存储单元:2・当第二维下标为力时,"恥在第绻 至纬+1段内,本段内幻』2前共有力段,其中每段内均可依次被划分成加个已不可再分的最小基本类型数据单元,因此前第ajJ 2段前中共有仇x j 2个存储单元: 3.当第3维下标为力时,aj i j 2j i 在幻也至幻也+1段内,本内段共有力个最基本的基本类型的数据单元,即丿3 因此,a jiJih 的存储地址的字节数为(貝中厶为基本类型数据所占的字节数):LOC (7i ,J 2 '人)=LOC(0,0,0)+ (6 x b 3 x J J + & x J 2)+J 3)L 三.多维数组C 程序表示:A[J1][J2][ .. ][Jn]>其数据结构定义为:a ・ …jj 力=1,2, ......... ,b\i J2=l,2, . 02, ............ , Jn=l,2, .. ,bno 内存存储排列如下图:若求 在内存中的存储位置,需根据各维下标的变化分段来计算:• • •1. 当第一维下标为力时,a hir-ir j n 在你 至绻+1段内JlJV'Jn 的位置上,其中你 前共有力段,其中每段内均可依次被划分成加段,加段又被划分成加段,加段又可分为伽段, ................ ,如此划分下去,直至划分至b”个已不可再分的最小基本类型数据单元为止,因此前第。
数据结构试题一、单选题1、在数据结构的讨论中把数据结构从逻辑上分为(C )A 内部结构与外部结构B 静态结构与动态结构C 线性结构与非线性结构D 紧凑结构与非紧凑结构。
2、采用线性链表表示一个向量时,要求占用的存储空间地址(D )A 必须是连续的B 部分地址必须是连续的C 一定是不连续的D 可连续可不连续3、采用顺序搜索方法查找长度为n的顺序表时,搜索成功的平均搜索长度为( D )。
A nB n/2C (n-1)/2D (n+1)/24、在一个单链表中,若q结点是p结点的前驱结点,若在q与p之间插入结点s,则执行( D )。
A s→link = p→link;p→link = s;B p→link = s; s→link = q;C p→link = s→link;s→link = p;D q→link = s;s→link = p;5、如果想在4092个数据中只需要选择其中最小的5个,采用( C )方法最好。
A 起泡排序B 堆排序C 锦标赛排序D 快速排序6、设有两个串t和p,求p在t中首次出现的位置的运算叫做( B )。
A 求子串B 模式匹配C 串替换D 串连接7、在数组A中,每一个数组元素A[i][j]占用3个存储字,行下标i从1到8,列下标j从1到10。
所有数组元素相继存放于一个连续的存储空间中,则存放该数组至少需要的存储字数是( C )。
A 80B 100C 240D 2708、将一个递归算法改为对应的非递归算法时,通常需要使用( A )。
A 栈B 队列C 循环队列D 优先队列9、一个队列的进队列顺序是1, 2, 3, 4,则出队列顺序为( C )。
10、在循环队列中用数组A[0..m-1] 存放队列元素,其队头和队尾指针分别为front和rear,则当前队列中的元素个数是( D )。
A ( front - rear + 1) % mB ( rear - front + 1) % mC ( front - rear + m) % mD ( rear - front + m) % m11、一个数组元素a[i]与( A )的表示等价。
⼆维数组地址a代表0⾏地址&a代表整个数组⾸地址正好等于⾸⾏⾸地址*a表⽰0⾏⾸地址a+1代表第0+1⾏地址(⼀⾏表⽰完整的列单位⽐如a[2][3] ,这⾥⼀⾏指3个单位)**a⾸⾏⾸地址元素(双重解引⽤:第⼀重确定⾸地址;第⼆重确定元素值)*a代表第0⾏⾸地址*(a+1)代表第0+1⾏⾸地址*(a+2)代表第0+2⾏⾸地址a[i]代表第i⾏元素⾸地址,等价于*(a+i)a[i][j]**a ==*(a[i]) 表⽰i⾏⾸地址元素,等价于 *(a+i)a[0] == *a 表⽰0⾏⾸地址&a代表整个数组的⾸地址&a+1代表该数组下⼀个元素(⼀个单位)的下个位置的地址*(a+i)+j 代表的是地i⾏第j个元素 *a+1代表第0⾏第1个元素*(a+1)+1代表第1⾏第1个元素输出:a[2][3]a = 0x7fffe14befd0*a = 0x7fffe14befd0&a = 0x7fffe14befd0// a *a &a 值相同a = 0x7fffe14befd0//定位于“层”a+1 = 0x7fffe14befdc加⼀层: c = 12 = 3(⼀⾏三列)*4(int型4字节)a+2 = 0x7fffe14befe8*a = 0x7fffe14befd0//定位于“个”*a+1 = 0x7fffe14befd4加⼀个:4(⼀个int型4字节)*a+2 = 0x7fffe14befd8&a = 0x7fffe14befd0//定位于“整”&a+1 = 0x7fffe14befe8加整个数组:e8 - d0 = 16+8 = 24 = (2*3)*4(int型4字节)&a+2 = 0x7fffe14bf000a = 0x7fffe14befd0a+1 = 0x7fffe14befdc*(a+1) = 0x7fffe14befdca[0] = 0x7fffe14befd0a[1] = 0x7fffe14befdc //加⼀⾏*a[0] = -1142944000。
在开发工业以太网项目的时候经常遇到一些小细节问题,在建立数据报进行传输的过程中传递txbuf缓冲区的地址的时候就遇到类似下面的问题。
一.简单说明1定义一个2X3的int型的二维数组int array[2][3];并且给这个二维数组赋值1,2,3,4,5,6;array[0][0]=1array[0][1]=2array[0][2]=3array[1][0]=4array[1][1]=5array[1][2]=6输出结果1 2 34 5 6array[0]表示第一行的首地址,也就是第一行第一个数的地址,也就是&array[0][0] So array[0]==&array[0][0];其实&array[0]还==array[0]==&array[0][0],都表示第一行的首地址。
array[1]是第二行的首地址,也就是第二行第一个数的地址,也就是&array[1][0]so array[1]=&array[1][0];试试&array[1]还==array[1]==&array[1][0]定义一个指针变量int *p;将第一行的首地址赋给p有3种方式。
1. p=array[0];2. p=&array[0];3. p=&array[0][0];p[0]就等同于array[0][0],也就是p[0]==1;(为了形象记忆,可以用替换的角度去记忆和理解。
因为之前说过p=array[0], so,p[0]就把p换成array[0]再加上[0]就是arary[0][0])p[1]等于array[0][1]等于2p[2]等于array[0][2]等于3同理,将第二行的首地址赋给p也有三种方式:3. p=array[1];4. p=&array[1];5. p=&array[1][0];p[0]等于array[1][0]等于4p[1]等于array[1][1]等于5p[2]等于array[1][2]等于6。