关于二维数组的地址
专题7 数组和指针的应用

例1. 写出结果: main() { int *p1, a[10]={1,2,3,4,5,6,7,8,9,10} ; p1=a; printf(“%d ”,*p1); printf(“%d ”,*p1++); printf(“%d ”, *(p1+3)); printf(“%d ”,*++p1); printf(“%d ”,(*p1)++); printf(“%d ”,*p1--); printf(“%d ”,*p1); } 例2.若有定义语句:double x[5]={1.0,2.0,3.0,4.0,5.0},*p=x;则错误引用x数 组元素的是[08年9月] A)*p B)x[5] C)*(p+1) D)*x
[C] D) aa+1
(3)通过指针变量来表示数组中各元素的地址
可以定义一个指针变量来存放数组的指针或数组元素的指针,且指针变 量的基类型就是定义数组时的类型 int *p,a[10]; for(p=a,k=0; k<10;k++) p++; 将数据写入数组元素中几种方式: (1)for(p=a,k=0; k<10;k++) { scanf(“%d”,p); p++; } 进一步简化: (2)for(p=a,k=0; k<10;k++) scanf(“%d”,p++); 再进一步简化: (3)for(p=a,p-a<10; p++) scanf(“%d”,p); 以上三种写法是等价的,要掌握,能看懂。
2、 通过指针变量来引用一维数组元素 当指针变量指向数组中的某个数组元素时,可以通过“*”来访问其所 指向变量的数据。
《c++程序设计》第7章 指针

(1)取地址运算符&: 取出变量的内存首地址
(2)指针变量的赋值: 指针变量=&变量;或指针变量=指针变量;
3.指针变量的引用
指针运算符* :通过指针变量间接访问变量对应存储单元内容。
【例7.1】定义指针变量
p、p1、q,并将变量a的 地址赋给p、p1,输出a、 p、p1、*p、*p1的值。
【例7.3】指针变量的自加、自减、加n和减n运算。例程
3.指针变量的关系运算
指针变量的关系运算是指针变量值的大小比较,即 对两个指针变量内的地址进行比较,主要用于对数组元 素的判断。
【例7.4】用指针变量求一维实型数组元素和,并输出数组每个元 素的值及数组和。 例程
4.指针运算符的混合运算与优先级
指针数组
例如,指针数组的定义: int *pi[4];
表示定义了由4个整型指针元素pi[0]、pi[1]、pi[2]、pi[3]组成的整型指针数组。 char *pc[4];
表示定义了由4个字符型指针元素pc[0]、pc[1]、pc[2]、pc[3]组成的字符型指针数组。 (3)指针数组元素的引用 【例7.15】用指针数组输出字符串
3.数组元素的引用
对一维数组a[ ]而言,当p=a时: ①第i个元素地址:&a[i]= p+i=a+i。 ②第i个元素值:a[i]= *(p+i) =*(a+i)=p[i]。
一维数组的第i个元素有四种方式引用: a[i]、*(p+i) 、*(a+i)、p[i]。
用数组指针的四种方法求一维数组中的最大值的方法为: 方法一:使用*(a+i)访问a[i] 方法一:用指针变量名p代替数组名a,即用 p[i]代替a[i] 方法二:移动指针变量p++,用*p访问a[i] 方法三:使用*(p+i)访问第 i个元素a[i]
C语言知识点总结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门课程的考试。
数组与指针

此外,还可通过算术元运算对指针进行移动, 此外,还可通过算术元运算对指针进行移动,来达到引用 其他数组元素的目的。 其他数组元素的目的。 a[0] p p &a[0] *p a[0] a[1] p+1 p+1 &a[1] *(p+1) a[1] a[2] P+2 p+2 &a[2] *(p+2) a[2] a[3] P+3 p+3 &a[3] *(p+3) a[3] a[4] p+4 p+4 &a[4] *(p+4) a[4]
a[0] a[1] a[2] a[3] a[4]
a
a a+1 a+2 a+3 a+4
a a+1 a+2 a+3 a+4
&a[0] &a[1] &a[2] &a[3] &a[4]
*a *(a+1) *(a+2) *(a+3) *(a+4)
a[0] a[1] a[2] a[3] a[4]
例3: main() { int a[5],*p,i; for(i=0;i<5;i++) scanf(“%d”,a+i); for(i=0;i<5;i++) printf(“%d”,*(a+i)); }
a[1] a[1][0] a[1][1] a[1][2]
此处, 的值与 的值与a[0]的值相同,但是基类型不同。a是二级 的值相同, 此处,a的值与 的值相同 但是基类型不同。 是二级 指针, 是一级指针。 指针,a[0]是一级指针。 是一级指针 a &a[0][0] a[0] 因此,以下赋值语句是错误的: 因此,以下赋值语句是错误的:p=a; a &a[0] a+1 &a[1] a+i &a[i] *(a+i) a[i]
《数据结构》填空作业题(答案)

《数据结构》填空作业题答案第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. 对于某一类特定的问题,算法给出了解决问题的一系列操作,每一操作都有它的确切的定义,并在有穷时间内计算出结果。
C语言第7章(顾元刚)-4

如果我们要存取二维数组的任意元素,则需要先确定 该元素所在行地址和列地址,再取该行、列地址所指 向单元的值。为此,C语言规定了若干表示二维数组 行、列地址的方法。仍以上述3行4列的二维整型数组a 为例,说明如下(假设数组首地址为2000):
表 7.1 二维数组地址和元素的表示方法
表示形式 a 含义 数组首地址 地址 2000
上一张
下一张
对指针变量进行的运算大致可分为如下几种:
① *p++ 等价于先得到*p,然后p=p+1。*p--同理。 ② ( *p ) ++ 等价于先得到 *p ,然后将其值加 1 ( p 指向元素的值加1)。(*p)--同理。 ③ *(++p) 等价于先p=p+1,然后得到*p。*(--p)同 理。 ④ p+j ( p 指向数组的某一个元素)得到当前地址基 础上向后偏移j个元素的地址。p-j同理。 ⑤ p1-p2(p1和p2指向同一数组)得到p1和p2指向元 素的下标差值。
② 用数组名加上编移量存取元素 main() { int t[10],j; printf("\nInput 10 numbers:\n"); for(j=0;j<10;j++) scanf("%d",t+j); printf("The 10 numbers are:\n"); for(j=0;j<10;j++) printf("%d ",*(t+j)); }
上一张 下一张
③ 用指向数组元素的指针存取元素 main() { int t[10],j; int *p; p=t; printf("\nInput 10 numbers:\n"); for(j=0;j<10;j++,p++) scanf("%d",p); p=t; printf("The 10 numbers are:\n"); for(j=0;j<10;j++,p++) printf("%d ",*p); } 三个程序运行情况均如下:
如何计算多维数组的地址数据结构
多维数组地址的计算方法一、二维数组若求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。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 去理解书中的表格
应用(1)
• • • • • • int one[4],int two[3][பைடு நூலகம்]; int *p; p=one; p=&one[i]; p=two[1]; p=*(two+1); p=&two[0][3];
• p=two是错误的!!!
应用(2)
• int one[4],int two[3][4]; • int (*pp)[4];/*可指向行地址*/ • pp=two;
• 错误的理解:一个指针符号表示一维数组, 两个表示二维数组 • int **ptp; • ptp = two /*错误*/
• 多思考,多实践,多领悟! • 网络上有很多讨论,可以开拓思路!
• 有些东西看似懂,实际上是不懂的。比如,下面 的偈语我也想搞懂! 菩提本无树 明镜亦非台 本来无一物 何处惹尘埃
关于二维数组的地址
--传说中的最难点
• 设有一维数组one[4],和二维数组two[3][4] • 二维数组是由一个特殊一维数组构成,这个特殊 一维数组的元素如下: two[0],two[1],two[2] • 以上三个元素又是一个一维数组,即, two[0], two[1],two[2]是一维数组的数组名 • 这样,如two[0]与one的逻辑意义是相同的! two[0]是一个地址,是一维数组的首地址!
• 参照对一维数组地址的理解,可得到: • 下标法:two[0][j]是元素 • 地址法:*(two[0]+j)是元素
• • • •
另一方面: 二维数组的名是数组的首地址,即two是地址。 对于一维数组,有: one+i是下标为i元素(one[i])的地址,*(one+i)是 one[i] (真实的元素值)。 • 所以,two+0就是two[0]的地址(难点,行地址), *(two+0)就是two[0]的“元素值”,一维数组 的首地址! (难点,列地址) • &two[0]就是two+0了! (难点,语义的理解)