百度
360搜索
搜狗搜索

二维数组指针的用法,怎么用指针指向二维数组,又怎么利用指针引用二维数组中的元素详细介绍

本文目录一览: 二维数组与指针、指针数组、数组指针的用法

二维数组和指针⑴ 用指针表示二维数组元素。 要用指针处理二维数组,首先要解决从存储的角度对二维数组的认识问题。我们知道,一个二维数组在计算机中存储时,是按照先行后列的顺序依次存储的,当把每一行看作一个整体,即视为一个大的数组元素时,这个存储的二维数组也就变成了一个一维数组了。而每个大数组元素对应二维数组的一行,我们就称之为行数组元素,显然每个行数组元素都是一个一维数组
下面我们讨论指针和二维数组元素的对应关系,清楚了二者之间的关系,就能用指针处理二维数组了。 设p是指向二维数组a[m][n]的指针变量,则有:
int* p=a[0];//此时P是指向一维数组的指针。P++后,p指向 a[0][1]。
如果定义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 a[3][4]={{10,20,30,40,},{50,60,70,80},{90,91,92,93}}; 则数组a有3个元素,分别为a[0]、a[1]、a[2]。而每个元素都是一个一维数组,各包含4个元素,如a[1]的4个元素是a[1][0]、a[1][1]、a[1]2]、a[1][3]。 若有: 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] 特别说明: 对上述二维数组a,虽然a[0]、a都是数组首地址,但二者指向的对象不同,a[0]是一维数组的名字,它指向的是a[0]数组的首元素,对其进行“ ”运算,得到的是一个数组元素值,即a[0]数组首元素值,因此, a[0]与a[0][0]是同一个值;而a是一个二维数组的名字,它指向的是它所属元素的首元素,它的每一个元素都是一个行数组,因此,它的指针移动单位是“行”,所以a+i指向的是第i个行数组,即指向a[i]。对a进行“ ”运算,得到的是一维数组a[0]的首地址,即 a与a[0]是同一个值。当用int p;定义指针p时,p的指向是一个int型数据,而不是一个地址,因此,用a[0]对p赋值是正确的,而用a对p赋值是错误的。这一点请读者务必注意。 ⑵ 用二维数组名作地址表示数组元素。 另外,由上述说明,我们还可以得到二维数组元素的一种表示方法: 对于二维数组a,其a[0]数组由a指向,a[1]数组则由a+1指向,a[2]数组由a+2指向,以此类推。因此, a与a[0]等价、 (a+1)与a[1]等价、 (a+2)与a[2]等价,┅,即对于a[i]数组,由*(a+i)指向。由此,对于数组元素a[i][j],用数组名a的表示形式为: ( (a+i)+j) 指向该元素的指针为: *(a+i)+j 数组名虽然是数组的地址,但它和指向数组的指针变量不完全相同。
第一,指针变量的值可以改变,即它可以随时指向不同的数组或同类型变量,而数组名自它定义时起就确定下来,不能通过赋值的方式使该数组名指向另外一个数组。
第二,数组名是指针,类型是指向元素类型的指针,但值是指针常量,声明数组时编译器会为声明所指定的元素数量保留内存空间。数组指针是指向数组的指针,声明指针变量时编译器只为指针本身保留内存空间。
例4 求二维数组元素的最大值。
该问题只需对数组元素遍历,即可求解。因此,可以通过顺序移动数组指针的方法实现。 main() { int a[3][4]={{3,17,8,11},{66,7,8,19},{12,88,7,16}}; int p,max; for(p=a[0],max= p;p

max) max= p; printf("MAX=%d/n",max); } 执行结果: MAX=88 这个程序的主要算法都是在for语句中实现的:p是一个int型指针变量;p=a[0]是置数组的首元素地址为指针初值;max= p将数组的首元素值a[0][0]作为最大值初值;p
<a[0]+12是将指针的变化范围限制在12个元素的位置内;p++使得每比较一个元素后,指针后移一个元素位置。 例5 求二维数组元素的最大值,并确定最大值元素所在的行和列。 本例较之上例有更进一步的要求,需要在比较的过程中,把较大值元素的位置记录下来,显然仅用上述指针移动方法是不行的,需要使用能提供行列数据的指针表示方法。 main() { int a[3][4]="{{3,17,8,11},{66,7,8,19},{12,88,7,16}};" p="a[0],max,i,j,row,col;" max="a[0][0];" row="col=0;" for(i="0;i<3;i++)" for(j="0;j
max) { max= (p+i 4+j); row=i; col=j; } printf("a[%d][%d]=%d/n",row,col,max); } 程序运行结果: a[2][1]=88 ⑶ 行数组指针 在上面的说明中我们已经知道,二维数组名是指向行的,它不能对如下说明的指针变量p直接赋值: int a[3][4]={{10,11,12,13},{20,21,22,23},{30,31,32,33}}, p; 其原因就是p与a的对象性质不同,或者说二者不是同一级指针。C语言可以通过定义行数组指针的方法,使得一个指针变量与二维数组名具有相同的性质。行数组指针的定义方法如下: 数据类型 ( 指针变量名)[二维数组列数]; 例如,对上述a数组,行数组指针定义如下: int ( p)[4]; 它表示,数组 p有4个int型元素,分别为( p)[0]、( p)[1]、( p)[2]、( p)[3] ,亦即p指向的是有4个int型元素的一维数组,即p为行指针

此时,可用如下方式对指针p赋值:

p=a;

(4)指针数组的定义

指针数组是指每个元素中存放的是指针。定义为 int *p[4];sizeof(p)=16,返回的是数组的总空间

C语言 二维数组 指针

a是数组第一行地址,代表一行,偏移量是2*4.
*(a+2)是数组第二行第一列地址,偏移量是4
*(*(a+2)+1)代表a[2][1]的值
*(a+2)+1和*(*(a+2)+1)
这完全是两个东西。第二个代表a[2][1]
二维数组名代表的是这个数组首元素的地址或者可以看作二维数组第一行的地址,a+2是指向第三行的,二维数组可以看作是以行为数组名的一维数组比如
int a[2][2]
数组名是a[2]
在这里*(a+2)代表的是第三行首元素的地址,然后加1的话就是第3行第二元素的地址了。所以*(*(a+2)+1)代表a[2][1]

c++中二维数组的指针如何定义?

// int a[2][2] = {0, 1, 2, 3};
// **a 就是 a[0][0] 第一行第一列。
// *(*a + 1) 就是 a[0][1] 第一行第二列。
// **(a + 1) 就是 a[1][0] 第二行第一列。
// *(*(a + 1) + 1) 就是 a[1][1] 第二行第二列。
int array[5][10];
int (*pArray)[10] = array; 定义一个指针数组,指向一个二维数组
二维数组的指针就是指针的指针,比如一个int型二维数组:int array[2][3];
指向它的指针就可以定义成:int **p;
如何使用这个指针呢,就和使用普通二维数组一样,比如第一行第二个元素:p[0][1]

怎样使用指针引用二维数组的元素

二维数组名a是一个指向指针的指针。也是一个指针数组名,它含3个元素,a[0]a[1],a[2]。虽然a存储的地址是该数组首元素的地址,但它指向的并不是一个变量,而是一个指针。应为a是一个指向指针的指针,它指向的是和自己存储的地址相同的指针,即a[0],a[0]是第一行一维数组的指针,可以指向具体变量。
这下明白了吧,*(a+0)它不是变量,她是指针,a指向a[0],*(a+0)就是a[0].
对于a[i][j](二维数组的大小为n×m)而言,
首先要搞清楚行指针和列指针
行指针:&a[i]或者a+i指向行,&a[i]=&*(a+i)=a+i
列指针:a[i]或*(a+i)指向列,a[i]等价于*(a+i)
元素的引用方式有如下三种方式
1.通过地址引用二维元素
*(&a[i][j]),
*(a[i]+j),
*(*(a+i)+j),
*(a[0]+m*i+j)
*(&a[0][0]+m*i+j)
(*(a+i))[j]
2.建立一个指针数组引用二维元素
int *p[3],a[3][2],i,j;
for(i=0;i<3;i++)
p[i]=a[i];//p[i]用来存放地址,a[i]为列地址
等价如下
(1) *(p[i]+j) 与*(a[i]+j)对应
(2)*(*(p+i)+j) 与*(*(a+i)+j)对应
(3)(*(p+i))[j] *(p[i]+j) 与*(a[i]+j)对应
(4)p[i][j] 与a[i][j]对应
3.建立一个行指针引用二维数组元素
int a[3][2],(*p)[2];
p=a;
(1) *(p[i]+j) 与*(a[i]+j)对应
(2)*(*(p+i)+j) 与*(*(a+i)+j)对应
(3)(*(p+i))[j] 与(*(a+i))[j]对应
(4)p[i][j] 与a[i][j]对应
例题如下
1.
#include

main()

{

int score[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}};

int i,j;

printf("输入学生号:0-2");

scanf("%d",&i);

printf("the score of No.%d are:\n",i);

for(j=0;j<4;j++)

printf("%d\t",*(*(score+i)+j));//score+i为列指针,*(score+i)为行指针

printf("\n");

}

2.

#include

main()

{

int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};

int *p;

for(p=a[0];p
<a[0]+12;p++) 使p依次指向下一个元素,a[i]和*(a+i)是指向列的指针;&a[i]或a+i是指向行的指针
{

if((p-a[0])%4==0)printf("\n");

printf("%4d",*p);//输出p指向的数组元素的值

}

printf("\n");

}

3

#include

阅读更多 >>>  js 数组删除,js中如何移除数组中指定的元素(两种方法)

main()

{

int score[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}};

int i,j;

printf("输入学生号:0-2");

scanf("%d",&i);

printf("the score of No.%d are:\n",i);

for(j=0;j<4;j++)

printf("%d\t",*(score[i]+j));

printf("\n");

}

4

#include

main()

{

int score[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}};

int i,j,*p;

printf("输入学生号:");

scanf("%d",&i);

printf("the score of No.%d are:\n",i);

for(p=score[i];p
<score[i]+4;p++)
printf("%d\t",*p);//p+i指向第i行,*(p+i)指向第i行0列元素*(p+i)+j指向第i行j列元素,是列地址

printf("\n");

}

5.

#include

main()

{

int score[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}};

int i,j,*p;

printf("输入学生号:");

scanf("%d",&i);

printf("the score of No.%d are:\n",i);

for(p=score[i],j=0;j<4;j++)

printf("%d\t",*(p+j));

printf("\n");

}

6

#include

main()

{

int score[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}};

int i,j,(*p)[4];//指针变量p指向包括4个整型元素的一维数组;

p=score;//p指向二维数组0行元素,p+1所指向的元素是p所指向元素的下一行元素;

printf("输入学生号:0-2");

scanf("%d",&i);

printf("the score of No.%d are:\n",i);

for(j=0;j<4;j++)

printf("%d\t",*(*(p+i)+j));//p+i指向第i行,p是行指针,*(p+i)指向第i行0列元素,是列指针。*(p+i)+j指向第i行j列元素,是一个元素的地址

printf("\n");

}

</score[i]+4;p++)

c语言中如何通过二级指针来操作二维数组

1、首先我们打开电脑里的C语言软件,新建一个工程和.c文件,输入头文件和主函数。
2、然后我们输入图示代码初始化数组,定义变量类型。
3、然后我们输入图示代码用for语句实现数组的访问。
4、然后我们输入图示代码进行输出。
5、然后我们输入图示代码编译、运行,即可通过二级指针来操作二维数组。

怎么用指针操作二维数组

//定义一个二维数组uint8_t test[3][2] = {{1,2},{3,4},{5,6}};//定义一个指针,指向该数组首元素 uint8 (*p)[2] = test;//取t[0][1] tmp1 = p[0][1];//用数组方式 tmp1 = *(p[0] + 1);//指针地址加数组下标方式 tmp1 = *( *(p + 0) +1 ); //纯地址方式

C语言二维数组与指针运算

首先看main里定义了一个整形的二维数组a,和整形变量i,和一个指向数组的指针 (*p)[4]并把a赋值给了它,然后一个for循环,只能循环3次 0,1,2.
然后输出*(*(p+i)+C)
首先*(p+i)就意味着访问第i行的数组就是p [1][4]
由于宏定义了#define C 2 c=2,所以就是取值后加2 就变成了p[3][4]
在取值 结果就是8
int (*p)[4]=a;表示指向一维数组(4列)的指针,,然后a【0】地址给了p,p+i就表示a【i】的地址.而*(p+i)+C就表示了a[i]的第C个地址,
在(*p)[4]中p是指向一个有4 个int元素的一维数组的首地址,int (*p)[4]=a就相当于int (*p)[4];p=a;两个语句,所以*(p+i)指向i行地址,*((*P+i)+C)指向i行C列的地址即a[i][C]。
1.int (*p)[4],表示定义一个数组指针。例:int (*p)[10]; p即为指向数组的指针,又称数组指针。数组指针是指向数组首元素的地址的指针,其本质为指针;指针数组是数组元素为指针的数组(例如 int *p[3],定义了p[0],p[1],p[2]三个指针),其本质为数组。数组指针的使用在某些情况下与指针数组很相似,要注意区别。
2.*(p+i)=a[i]
3.*(*(p+i)+C)=a[i][C]
4.这个程序的结果为:
3
5
7
要注意“\n”表示换行
呵呵,希望对你有帮助

怎么用指针指向二维数组,又怎么利用指针引用二维数组中的元素

电饭锅电饭锅梵蒂冈
如果只是指向首行首列(第0行0列)的元素,直接用数组名赋值给指针变量即可(与一维数组相同,数组名就是首地址)
二维数组是以行为单位的,每一行都是一个一维数组,因此,存放顺序是:第0行0列-第0行最后列-第1行0列-第1行最后列-第2行0列 这样类推,在指针运算的时候,按这个规律做推算。
在行做运算时,只需要数组名+偏移位置就可以指定对应行0列元素
如果只是指向某行的首列(0列)元素,可用数组名+行号下标赋值给指针变量(不用写列号下标),如p=m[2],
如果要指向具体的该行该列,可使用&符号指定(比较直观的方式),如p=&m[2][1],也可使用数组名+行下标+偏移位置来指定,如p=m[2]+1就是指向第2行(物理位置是第三行)第1列(物理位置是第2列)
用指针引用数组元素,仍然可以使用该指针变量的*运算符(与一般的指针变量取对应值的方式完全相同)
另外,前面提到的数组名,以及数组名+行号下标的方式也可以用来取第0行0列或指定行0列的元素,其它列(或行)可以使用偏移运算的方式取元素值,不过,必须加上*运算符,否则取到的将是内存地址本身而不是元素。举例来说,*(m[2]+1)是用于取第2行1列(物理位置是第三行第二列)的值

c语言里面怎么用指针表示二维字符数组

二维数组就是数组的数组,二维数组即数组的元素是一维数组的数组。那么我们要用指针指向二维数组,就是要定义一个指向数组的指针了。例如:
char str[3][10]; //定义了一个char型的二维数组char (*pstr)[10]; //定义了一个指向char型的数组指针pstr=str; //指针指向二维数组str下面用pstr这个指针对二维数组进行赋值操作
int i;for(i=0;i<3;i++) scanf("%s",*(p+i)); //*(p+i)等价于str[i]

网站数据信息

"二维数组指针的用法,怎么用指针指向二维数组,又怎么利用指针引用二维数组中的元素"浏览人数已经达到20次,如你需要查询该站的相关权重信息,可以点击进入"Chinaz数据" 查询。更多网站价值评估因素如:二维数组指针的用法,怎么用指针指向二维数组,又怎么利用指针引用二维数组中的元素的访问速度、搜索引擎收录以及索引量、用户体验等。 要评估一个站的价值,最主要还是需要根据您自身的需求,如网站IP、PV、跳出率等!