c语言指向二维数组的指针,学习c语言中的指向二维数组的指针问题

1,学习c语言中的指向二维数组的指针问题指向二维数组的多重指针不过是 n级间址指向n-1级罢了如此而已n>int ***p你要想任何东西 的指向都是 两个之间的关系指针就是简单的指针 只是数据类型不同而已所有的指针都一样 (作用)int a[5][5];int **p;是指向一位数组的int a[5][5][5]a是指针,不过是行指针,p的基类型int,而 a 的基类型是一个包含4个整形元素的一类数组.int (*p)[4] = a;这样定义p也会编译过去的,因为这时p的基类型也是一个包含4个整形元素的一类数组 。至于int* p = a[0];编译正确,是因为a[0]也是指针 , 基类型也是int 。
2,C语言指向二维数组的指针这个指针是一个"行指针" 他唯一能指向一个 有 6 列(因为该指针定义时候下标为6) 的二维数组, 赋值的时候只要将数组名任意一行的首地址赋给它 你上面的x 是第0行的首地址也可以将第一行的首地址给他 那就是p=a[1]; 但是不能将一个元素的地址给它比如 p=&a[1][1]; 这是错的当 行指针赋值完以后 就可以像二维数组一样操作比如要取第i行第j个元素的值就是p[i][j] 编译器会转换成*(*(p+i)+j)来操作之前你所接触的指针属于列 指针只能指向一列一列的如果要将一个列指针指向一个二维数组那么就要赋给它指定元素的地址比如 int *p;p=a;a是数组名 也是第0行0列的地址也可以是p=&a[i][j];列指针访问二维数组的话 不可以像行指针那样 访问一个指定点 他必须把一个二维数组看成一个一维数组要访问的话 必须递增p的值比如p++; 而不能p[i][j]如果你能明白这2种指针的区别 就能知道 for里面是怎么引用行指针来访问数组的了一、你的float score数组定义的是:一个3行、4列的二维浮点数组,数组的元素为浮点数 。如果你换个格式书写就清晰了! float score[3][4]=在调用的过程中 , score 就是这个数组的首地址,指向的是浮点数组二、你的float *p定义的是:一个指向浮点数的指针 。这个是一维的 。在调用的过程中,float 指向的是 xx 。一个浮点数字 。两个的定义不同 , 所以参数传递过程中会出错 。三、你的float (*p)[4]定义的是:一个指向含有四个元素的浮点数组的指针 。在调用的过程中,float 指向的是这时两个定义相同,所以参数传递过程中没有错误 。四、有个建议,你的程序书写格式不清晰,不利于你纠错和修改,应该尽量的清晰、明确 , 不建议使用简化方式定义参数 。作为一个软件工作者,应该尽量使程序流畅、格式清晰、易读,这是一个软件工作者最基本的职业素养 。格式化后,程序如下,会清晰很多: #include<stdio.h> void main() void search (float (*p)[4],int n);/*这里的 float *p 好像有问题*/float score[3][4]=search(score,2); } void search(float (*p)[4],int n)/*这里的 float *p 好像有问题*/ int i;printf("the score of No.%d are:\n",n);for(i=0;i<4;i++)printf("%5.2f",*(*(p+n)+i));}printf("\n"); }【c语言指向二维数组的指针,学习c语言中的指向二维数组的指针问题】
3 , c语言指向二维数组的指针变量先从存储的角度对二维数组作一个全面的了解 。二维数组在内存中的存储,是按照先行后列依次存放的 。从内存的角度看,可以这样说 , 二维数组其实就是一个一维数组,在内存中没有二维的概念 。如果把二维数组的每一行看成一个整体,即看成一个数组中的一个元素,那么整个二维数组就是一个一维数组,它以每一行作为它的元素,这个应该很好理解 。第一,来详细介绍二维数组与指针的关系 。-首先定义个二维数组 array[3][4],p 为指向数组的指针 。若p=array[0],此时p指向的是二维数组第一行的首地址,则 p+i 将指向array[0]数组中的元素array[0][i] 。由以上所介绍的二维数组在内存中的存储方式可知,对数组中的任一元素array[i][j] ,其指针的形式为:p+i*N+j (N为每一行的长度) 。元素相应的指针表示法为:*(p+i*N+j),下标表示法为:p[i*N+j]。For Example:array[4][3]=int * p=array[0];数组array有四个元素,分别为array[0],array[1],array[2],array[3],每个元素为包含3个元素的一维数组 , 如array[0]的3个元素为 array[0][0],array[0][1],array[0][2] 。元素array[2][2]对应指针为:array+2*3+2,指针表示法为:*(array+2*3+2),下标表示法为:array[2*3+2]。特别注意:虽然 array[0] 与 array 都是数组首地址,但两者指向的对象不同,这点要非常明确 。array[0] 是一维数组的名字,它指向的是一维数组array[0]的首地址,所以 *array[0]与array[0][0]为同个值 。而 array 是二维数组的名字,它指向的是所属元素的首地址,其每个元素为一个行数组 。它是以行来作为指针移动单位的 , 如array+i 指向的是第 i 行 。对 array 进行 * 运算,得到的是一维数组 array[0] 的首地址,所以 *array 与 array[0]为同个值 。如果定义 int* p , p为指int类型的指针,指向int 类型,而不是地址 。故以下操作 :p=array[0] (正确) ,p=array (错误)。这点要非常注意 。第二 , 看看如何用数组名作地址表示其中元素 。对二维数组array ,array[0] 由 array指向,故*array 与array[0] 是相同的,依次类推可得 array[i] 由array+i 指向,*(array+i) 与array[i]是相同的 。因此 , 对于数组元素 array[i][j]  , 用数组名表示为 *(*(array+i)+j) ,指向该元素的指针为 *(array+i)+j。注意:数组名虽然是地址,但与指向数组的指针性质不同 。指针变量可以随时改变其所指向对象,而数组名不可以 , 一旦被定义,就不能通过赋值使其指向另外一个数组,但是在Java中则可以 。第三,顺便了解一下不太常用的行数组指针 。对于二维数组array[4][3],与int* p。二维数组名array 不能直接赋值给p 。原因前面已讲过,两只的对象性质不同 。在C语言中 , 可以通过定义一个行数组指针 , 使得这个指针与二维数组名具有同样的性质,实现它们之间可以直接赋值 。行数组指针定义如下:int (*p)[3]; 它表示,数组 *p 具有三个int类型元素,分别为 (*p)[0] , (*p)[1] , (*p)[2] ,即 p指向的是具有三个int类型的一维数组,也就是说,p为行指针 。此时 , 以下运算 p=array 是正确的 。第四 , 二维数组作为函数参数 。二维数组作为函数参数一般有两种方式:(1) void func(int **array)注意第二种方式一定要指明二维数组的列数当二维数组名作为函数实参时,对应的形参必须是一个行指针变量 。和一维数组一样,数组名传送给变量的是一个地址值,因此,对应的形参也必须是一个类型相同的指针变量 , 在函数中引用的将是主函数中的数组元素,系统只为形参开辟一个存放地址的存储单元,而不可能在调用函数时为形参开辟一系列存放数组的存储单元 。int main()double a[3][4];……fun(a);……fun(double (*a)[n])……楼主你好:二维数组的指针不难理解 。请参看我的帖子:http://wenwen.sogou.com/z/q796322199.htm是关于指针的很通俗易懂的解释!有不明白的,qq我就可以了 。qq:270495267倒数第四行*(*(a+2)+2)就等价于你写的*(*board+i))其实就是*board[i] 。*board就相当于board[0][0]的地址 , 也就是&board[0][0]

    推荐阅读