C语言怎么用指针代替二维数组

如题所述

1.设p是指向二维数组a[m][n]的指针变量,则有:

int* p=a[0];//此时P是指向一维数组的指针。P++后,p指向 a[0][1]。

2.如果定义int (*p1)[n];p1=a;p1++后,p1指向a[1][0];  

则p+j将指向a[0]数组中的元素a[0][j]。

由于a[0]、a[1]┅a[M-1]等各个行数组依次连续存储,则对于a数组中的任一元素a[i][j],指针的一般形式如下:

p+i*N+j, 相应的如果用p1来表示,则为*(p1+i)+j。

元素a[i][j]相应的指针表示为:

*( p+i*N+j) ,相应的如果用p1来表示,则为*(*(p1+i)+j)。

同样,a[i][j]也可使用指针下标法表示,如p[i*N+j]。

若有:

int *p=a[0];

则数组a的元素a[1][2]对应的指针为:p+1*4+2

元素a[1][2]也就可以表示为:*( p+1*4+2)

用下标表示法,a[1][2]表示为:p[1*4+2]

扩展资料:

指针与数组的关系:

1.指针数组:就是一个由指针组成的数组,那个数组的各个元素都是指针,指向某个内存地址。 char *p[10];  //p是一个指针数组

2.数组指针:数组名本身就是一个指针,指向数组的首地址。注意这是一个常数。

example:

char (*p)[10];  //p是一个数组指针

3.函数指针:本身是一个指针,指向一个函数入口地址,通过该指针可调用其指向的函数,使用函数指针可实现回调函数

参考资料:

百度百科-指针

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-05-21
#include<stdio.h>
void main()
{
int i,j;
int a[3][3],*p=a[0];//相对于一维数组是一样的,a[0]本身就是一个一维数组,不要写成*p=a,写成*p=&a[0][0]也可以
for(i=0;i<3;i++)
for(j=0;j<3;j++)
scanf("%d",&a[i][j]);
printf("%d\n",*(p+5));//调用就直接加数字,该数字是<3*3的就行
}
第2个回答  2013-05-21
设二维数组为typename a[M][N],则指向该数组的指针为typename (*p)[N] = a;这样就可以用p来代替二维数组了。
第3个回答  推荐于2017-11-28
看你具体的应用,提供几个方法供参考:
1、一级指针
例:
int a[M][N];
int *p = &a[0][0];
相当于将二维数组当一维数组用,需要自己根据N的大小计算下标,使用却很灵活
2、指针数组
例:
int a[M][N];
int *p[M];
for(int i=0; i<M; i++)
{
p[i] = a[i];

}
之后用法可以跟二维数组一样,缺点在于M是固定的
3、指向数组的指针
例:
int a[M][N];
int (*p)[N];
p = a;
用起来跟二维数组没区别,缺点在于N是固定的
4、二级指针
例:
int a[M][N];
int **p;
p = (int *)malloc(sizeof(int *)*M);
for(int i=0; i<M; i++)
{
p[i] = a[i];

}
之后的用法可以跟二维数组一样,缺点在于用法比较麻烦,需要维护动态内存本回答被提问者采纳
第4个回答  2013-05-21
#include<stdlib>
#include<stdio>
void main()
{
int a[10][10];
int *p=&a[0][0];
for(int i=0;i<10*10;i++)
printf("%d",*p);
}

c语言里面怎么用指针表示二维字符数组
char (*pstr)[10]; \/\/定义了一个指向char型的数组指针 pstr=str; \/\/指针指向二维数组str 下面用pstr这个指针对二维数组进行赋值操作 int i;for(i=0;i<3;i++)scanf("%s",*(p+i)); \/\/*(p+i)等价于str[i]

c语言问题,用指针为一个二维数组赋值
ptr=arr;其实你这样赋值也是可以的,是没有问题的。因为arr是二维数组的数组名,它(arr)本身就代表这个二维数组的第0行的地址。问题关键不是出现在这里,而是在你程序的while循环语句中 while(scanf("%f", &ptr+i)&&i!=7)i++;你这样写是不对的,首先ptr指向的是一个地址,所以ptr+i也是一个...

C语言程序设计中"二维数组中元素指针的表示"的例题,求详解
二维数组和指针 ⑴ 用指针表示二维数组元素。要用指针处理二维数组,首先要解决从存储的角度对二维数组的认识问题。一个二维数组在计算机中存储时,是按行存储的,即先存储第一行的元素,再存储第二行的元素。当把每一行看作一个整体,即作为一个大的数组元素时,原来的二维数组也就变成一个一维数组了。

C语言怎么定义一个字符指针指向一个二维字符数组的首地址
二维数组也是“数组的数组”所以定义一个指向由m个元素组成的一维数组指针即可指向二维数组的首元素地址。如:char arr[2][2] = { { 'a', 'b' }, { 'c', 'd' } };char (*p)[2];p=arr; \/\/ p指向首元素地址。char c = *(p[0]+ 1);\/\/ 指向0行1列 即字符b ...

C语言中二维数组行指针是什么
对于二维数组array[4][3],与int* p 。二维数组名array 不能直接赋值给p。原因前面已讲过,两只的对象性质不同。 在C语言中,可以通过定义一个行数组指针,使得这个指针与二维数组名具有同样的性质,实现它们之间可以直接赋值。行数组指针定义如下:int (*p)[3]; 它表示,数组 *p 具有三个int类型...

C语言如何定义指针指向字符型二维数组
使用指针变量访问二维数组的任意一个元素的方法:1.使用列指针:定义一个列指针p,让它指向二维数组的第0个元素 int a[3][4];int *p;p=&a[0][0];\/\/因为a[0]是第0行的数组名,所以p=&a[0][0]相当于p=a[0],因为a[i][j]前面共有i*4+j个元素 该二维数组的任意i行j列元素可...

使用列指针输出二维数组元素
在C语言中,数组是不同于普通变量的,实际上C定义的数组是指向该数组第一个元素的指针。这是第一个概念,即数组名就是指针,所以可以直接当做指针来用,例如:对于一个数组a[],要取其第三个元素的值,既可以用a[2],也可以用a+2来访问。对于一个二维数组,如果用下标变量来表示的话,则可以...

求c语言指针方式引用二维数组问题
都是19ff18。它们是a[1][0](元素3)的存放位置,19ff0C+3×4=19ff0c+12=19ff0c+c=19ff18。后面也是类似解释。具体p1、p2、p3的使用,是前面定义了三个字符串,此处拿来使用。你可以直接把p1的内容"%x,%x,%x,%x,%x\\n"拿来替换掉p1,就好理解了。有什么问题请留言。

二级C语言。。。关于指针与二维数组。。。谢谢
A) p是一个指向char类型的指针,如果指向数组,则数组也应该是一维数组才可,这里s是二维数组,不可 B)k是一个数组指针,它指向一个数组,但是这个数组要求有三个char类型的数据,跟p不匹配,不可 C)s[0]表示s这个二维数组的第一行,也就是,它属于一维数组,跟p匹配,可 D)将一个二维数组...

C语言中二维数组的指针问题
p=&a[0][0] 它的意思的使指针p指向数组a的第0行第0列,而在后面执行p++的时候,就会使指针顺序后移,依次指向 a[0][1] a[0][2]……a[2][2] 的地址;假如:p=a 这是使指针p指向数组a的首行,当你输出*p这个值的时候,它输出的值是a[0][0]这个元素的值,但是当你执行p+1的...

相似回答