二维数组和它的指针

这片文章介绍二维数组int a[ i ] [ j ]中的符号:a,&a[ i ],&a[ i ][ j ],a[ i ][ j ],&a[ i ] [ j ]的含义,重点在后面第二部分的分析,但是前面第一部分的复习数组指针,指针数组和二维指针是前提,前面的不会,后面的没法理解。这片文章写的有些费劲,个人能力不够,可能会有错误,希望各位朋友能够指正,共同进步。//握手

一:先回顾一下数组指针,指针数组,二维指针

先根据逐层分析分方法分析下面的代码 
(1)int (*p)[5]; 
(2)int *p[5]; 
(3)int **p;

看到上面的定义方式一一分析 
分析(1) 
第一步:找核心,核心是p 
第二步:由p向外一层分析,p和*结合是指针,再和[]结合,所以int (*p)[5] 是数组指针

分析(2) 
第一步:找核心,核心是p 
第二步:由核心p向外一层分析,p先和[]结合是数组,数组中元素是*类型,所以int *p[5];是指针数组。

分析(3) 
第一步:找核心,核心是p 
第二步:由p向外一层分析,p先和结合是指针,然后*p再和结合是指针的指针,即二重指针。

(4)二重指针和指针数组 
二重指针就是指针数组指针(有点乱哈)

先看指针数组 int *p[5]; 
(1)p是一个数组,数组有5个元素,每个元素都是int*类型 
(2)指向int * 类型的指针不就是int**嘛 
(3)得出结论,二重指针就是指针数组指针。

二:二维数组和指针的纠缠

先定义一个二维数组 int a[ i ] [ j ]; 
a是二维数组数组名,把二维数组看成一个平面。i表示有i行,j表示每行有j列。有一个一维数组int a[ 10 ],写成二维数组就是int a[ 2 ] [ 5 ],把10个元素分成2组,每组有5个元素。i表示第一维表示有多少组,j表示每组有多少元素。

符号含义 int a[ 2 ][ 5 ];int a[ i ] [ j ];

跟着思路一步一步走

第一维表示有2个一维数组分别是 a[ 0 ]和a[ 1 ](也就是a[ i ]和a[i+1]) 
第二维表示在这两个数组中分别有5个元素。

那么第一个问题来了

两个数组的数组名是谁?

对,a[ i ]和a[i+1] 既然a[ i ]和a[ i+1 ] 是一维数组名

那么第二个问题来了?

a[ i ]和a[ i+1 ]类型是什么?

一维数组数组名做右值表示数组首元素的首地址,首元素是int,首元素的地址是int * ,&b做右值表示整个数组的首地址,类型是int(*)[] 
int b[10]; 
int *p; 
p = b;

所以 a[i]这个数组名做右值表示数组首元素的首地址,首元素是一个数组,首元素的地址,数组的首地址是int * ,&a[i]表示整个数组的首地址(这个整个数组时指包含两个数组的那个数组)

!!这里很重要: 
迷惑1:a[i]做右值不是表示数组首元素的首地址吗?首元素是一个数组,那么其类型应该是数组的指针啊,类型是int( * ) [ ];

解答:a[i]这个数组名做右值确实表示数组首元素的首地址,比如int b[10];数组名b做右值表数组首元素的首地址,也就是相当于&b[0],那再二维数组中,a[ i ]和a[i+1]分别是两个数组,每个数组有5个int元素,这么一想就是了:a[ 0 ]这个数组名做右值时等价于&a[0][0],第1个数组的 
第1个元素,第一个元素是int类型,所以a[ i ]是int* 类型的指针。&a[ i ]表示整个数组(包含i个数组的大数组)的首地址,也就是看的是a[ i ]和a[ i+1 ]这两个数组的首地址,所以&a[ i ]的类型才是数组指针,int( * ) [ ];二维数组名a和&a[ i ]类型一致。

二维数组的运算 
int b[ 10 ]; 
下标访问b[ 1 ] 
指针访问* ( b+1)

int a[ 2 ] [ 10 ] 
下标访问a[ 1 ] [ 1 ] 
指针访问* ( * (a+1)+1)

分析:a是二维数组的数组名,在这肯定做右值,a做右值等价于&a[0]也就是第一个数组的首地址,(总共有两个数组),类型是int(*)[];这时候当a+1时,a指向谁?a是数组指针,a肯定指向数组,这时候a+1,偏移量为a[i]这个数组的大小,指向了a[1]这个小数组。每个小数组有5个元素,大小是一个int。这时候j的偏移量就是一个int的大小。

总结: 
(1)int a[ i ][ j ];二维数组表示有i个小数组,没个小数组有j个元素。 
(2)a[ 0 ]做右值表示& a[ 0] [ 0 ] 
&a[ 0 ]做右值和二维数组名a做右值含义一样。 
(3)a[ i ][ j ]表示每一个元素,每一个元素都是int类型的。 
&a[ i ] [ j ]表示int* 类型的指针。 
(4)a[ i ] [ j ] 等价于 * (* (a+i)+j)

二维数组比较难理解,难道真的是只可意会不可言传?虽然写了这篇文章,但总感觉不是很对,以我目前的水平无法找出错误,请高手指点。//感谢

时间: 2024-10-12 18:38:07

二维数组和它的指针的相关文章

二维数组转化成一维指针

二维数组转化为一维指针来使用本实例用到了随机数,链表生成,遍历,有待扩展 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 #include<math.h> 5 //定义个结构体Emp用来存放员工信息 6 typedef struct Emp 7 { 8 int eno; 9 char *ename; 10 int dno; 11 Emp *next; 12 13 }emp,*pemp

【C/C++学院】(3)二维数组/二分查找法/指针/模块注射

1.二维数组 二维数组可以当做一个一维数组, 每一个元素又是一个一维数组. #include <stdio.h> #include <stdlib.h> void main() { int a[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { printf("%d,%d,%d,%x,%x &

二维数组的输出--(指针输出 和 指针数组输出)

当我第一次看见数组指针和指针数组这两个名字的时候,我以为是一个东西呢,当看到英文解释就知道这两个是不一样的了. 指针数组:array of pointers,用于存储指针的数组,也就是数组元素都是指针 数组指针:a pointer to an array,指向数组的指针,数组可以是任意维的 下面举例说明: int a[3][4]   --->这个无需多说,就是一个二维数组. int (*p)[4]   --->就相当于int p[][4],它是一个二维数组的指针,可以指向一个第二维度为4的二维

二维数组名和二级指针

1. 指针 1.1 一个指针包含两方面:a) 地址值:b) 所指向的数据类型. 1.2 解引用操作符(dereference operator)会根据指针当前的地址值,以及所指向的数据类型,访问一块连续的内存空间(大小由指针所指向的数据类型决定),将这块空间的内容转换成相应的数据类型,并返回左值. 有时候,两个指针的值相同,但数据类型不同,解引用取到的值也是不同的,例如, 1 char str[] ={0, 1, 2, 3}; /* 以字符的ASCII码初始化 */ 2 3 char * pc

二维数组求平均值(指针的使用)

#include<stdio.h> int main() { int buf[3][5] ={{1,2,3,4,5},{4,5,6,7,8},{7,8,9,10,11}}; int i; int j; //求行平均值 for(i = 0; i < 3; i++) { int sum = 0; for(j = 0; j < 5; j++) { sum += (*(*(buf + i) + j)); } printf("sum = %d\n",sum/5); } /

二维数组指针问题

对于二维数组int a[][4]来说..有以下要点: 1. 表示形式            含义                                                 结果(举例)  备注 a                    二维数组名,指向一维数组a[0],即0行首地址  2000   行指针 a[0],*(a+0),*a   0行0列元素的地址                                   2000   列指针 a+1,&a[1]    

例看二维数组,指针,二维数组指针

例程: /****************************************************** * * 文件名:例程 * * 文件描述:例看二维数组,指针,二维数组指针 * * 创建人:Jesse * * 版本号: * * 修改记录: * ******************************************************/ #include <stdio.h> #define ROW 3 #define LINE 3 void main(voi

二维数组和二级指针关系浅析

昨天写了关于一级指针的见解,即二级数组的用法和二级指针差不多,关于数组指针和指针数组这两个是不同的概念,这一点我们一定要清楚: 数组指针我们可以理解为指向数组的指针,就是一个指针: 指针数组则可以理解为数组里存的是指针,即每个储存空间上储存的是指针变量:这里储存了多个指针 一个数组可以这样定义 char a[3];分配了3个字节的内存 二维数组可以这样定义 char b[3][3];分配了3*3 即9个字节的内存 我们知道一维数组和一级指针的用法差不多,那么二级指针有和二级指针有什么关系呢? {

二维数组和二级指针(真的没什么关系)

刚开始学c语言的时候,总是会认为,一级指针可以用来访问一维数组,那么二维数组就要用二级指针来访问啦.... 实际上二级指针和二维数组真的没什么关系,而且,切记千万不要用二级指针访问二维数组..... 下面是几个有关的小程序,加深印象........ 实验环境:主机CPU酷睿i5,vs2012 程序1: int _tmain(int argc, _TCHAR* argv[]) { int **p= NULL; int a[2][3] = {1,2,3,4}; p = a; return 0; }