怎么让一个二维指针指向一个二维数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么让一个二维指针指向一个二维数组相关的知识,希望对你有一定的参考价值。

让 **p=a[N][N]

求实现方法

楼主,我想讲讲二级指针的原理,它是指向内存地址的地址,简单说就是取两次地址,一维数组,二维数组它们的元素都对应拥有一个暂时分配的内存地址,就是说只需要一个一级指针就可以完成取址,如果你用一个二级指针去取址是会取到乱值,如果是系统的地址系统就会崩溃(我就是试过用指针把编译器搞崩溃了),我下面例子说明一下:
一级指针取址:
char a[10];
char *p;
p=a/*将a[10]首地址赋值给一级指针*/
scanf("%s",p)/*编译系统会移动自动指针*/

char a[10][10];
char *p;
p=a[0]/*将a[10][10]首地址赋值给一级指针*/
scanf("%s",p)/*编译系统会移动自动指针*/
二级指针:
char *a[]="12","34","56";/*定义一个指针数组*/
char **p;/*二级指针*/
p=a;
printf("%s",*p);/*输出12*/
这里我解释一下,定义一个指针数组,就是数组里面又有地址,你仔细看看,数组有地址,指针数组里面的字符串如("12")也是有地址的,这样就需要用一个二级指针指向它了,就是二级寻址,这是*p就不再是元素,就变成字符串"12"的首地址,由于系统自动移动指针,所以就输出12
呵呵,如果你明白,那么三级指针也是同样道理,定义一个指向指针的指针数组,用一个
三级指针实现三级寻址,就是找三次地址,这里我就不举例了,怕你不明白了,呵呵……你现在明白了吗?

参考资料:如果您的回答是从其他地方引用,请表明出处

参考技术A 二级指针可以指向二维数组吗? 答:NO 不可以
因为 二维数组名 是常量 不可改变!
char a[3][5] ;
你试想一下,如果 a 被改变了,那么a还能代表二维数组吗?用一个二级指针接收过去,指针是可以改变的啊,如果强制指针改变了a,那么a还是二维数组吗?所以这么操作都是被编译器禁止的,直接报错处理。但是a可以参与运算:比如 px=a+1,这样是可以,因为a没有被改变
二维数组名两个特点:
1,a代表整个数组大小(3x5x类型占用字节=总字节数,这里的例子是15个字节)
2,地址层面:a指向0行地址,记住0行是代表一维数组,非要用* 取0行里的内容的话,只能取出0行首列的内容,首列的下一个内容 是无法取出,因为行移动一次,就是移动了一个行,即5个char字节的跨度。
参考技术B #define N 2
typedef char T_Array[N][N];

T_Array aa;
T_Array * p = &aa;
参考技术C 实现代码:
int a[m][n];
int *p = &a[0][0];
通过p[i*n+j]访问a[i][j]

在C语言和C++语言中,数组元素全为指针的数组称为指针数组。
一维指针数组的定义形式为:“类型名 *数组标识符[数组长度]”。
例如,一个一维指针数组的定义:int *ptr_array[10]。

c 语言用指针表示二维数组的列 怎样表示

定义二维指针,例如:int (*p)[3],a[3][4];p=a;
那么指针指向二维数组的列是这样:*(*(p+1)+2)/*指向第二行第三列,即:a[1][2]*/
就是说,二维指针中*p是把行指针换成列指针。**p才是指向的数值。
参考技术A C语言是按行优先的方式存储的,如果您不是特别需要,还是把矩阵做个转置吧 参考技术B i 行 j 列 单元地址 int *p=*(p+i)+j;
第一个单元地址 int * p0=*p+j;
单元增量 就是每行的列数; int d=列数;
int *p1=p0+d;
参考技术C a[i][j]=(*p)[j]
for(m=0;m<i;m++)
*(*p[j]+m)+j

以上是关于怎么让一个二维指针指向一个二维数组的主要内容,如果未能解决你的问题,请参考以下文章

c 语言用指针表示二维数组的列 怎样表示

c++如何用指针指向二维数组

C语言指向二维数组的指针

创建指向二维数组的指针

怎样求一个二维数组元素之和以及二维数组元素的最小值及下标

C语言 如何定义一个二维指针数组?