2024年10月数组指针和二维数组的关系(C语言:简述一下“数组和指针的关系”)

 更新时间:2024-10-12

  ⑴数组指针和二维数组的关系(C语言:简述一下“数组和指针的关系”

  ⑵C语言:简述一下“数组和指针的关系”

  ⑶形式:例如int(*p)();因为p先和结合,说明p是数组,数组的内容是一个int(*)()类型的指针函数指针数组在转换表中应用广泛

  ⑷指向函数指针数组的一个指针,也就是说,指针指向一个数组,数组的元素都是函数指针

  ⑸二维数组名有什么用,它和二级指针有什么关系

  ⑹二维数组名即数组地址,指向首行地址,不是指针的指针。表面上看,行地址即一维数组指针,而数组名指向行就应该是指针的指针。但是你考虑过没有,如果a,假设int**p=a;那么要对行递增执行p++时,编译器如何知道列宽?因为int**是指指向一个int*类型的指针,其数据宽度是字节,内置宽度,因此p将指向下一个整数元素地址,也就是p递增了字节,而不是个int型数据的宽度,这就错位了。所以a,而不是int**。所以应该这样int(*p)=a;其含义为,p是一个指向(含个int类型元素的一维数组或行的指针,其实本质上任何指针都是字节(位系统,你完全可以将一种指针类型强制转为任何其他类型,那为什么还要区分指针类型,就是为了指针运算时实现数据对齐,准确定位。

  ⑺C语言指针的指针和二维数组的区别

  ⑻指针的指针和二维数组完全俩东西,二维数组是一维数组的一维数组,元素是数组,所以可以隐式转化为int(*),跟int**两回事,扩展到更多维或其它类型也是成立的,只能隐式转化为第一维的元素的指针补充说明下隐式转化为指针,简单说就是这样(T是任意类型设有一个数组Ta;a的类型是“T”,在做大多数运算的时候,都先隐式转化为“T*”类型,即T的指针对于多维数组,可以看做是一个一维数组,数组的元素类型就是第二维开始的数组类型,比如:Ta;是一个有个类型为“T”元素的数组,用代码解释更清晰:typedefTU;Ua;跟上面的定义等价,所以a只能隐式转化为“U*”,“U*”展开后也就是“T(*)”这个类型了,跟多级指针没关系,因此,多维数组不存在到多级指针的转化规则,强转只会导致问题

  ⑼数组指针的指向一维数组和二维数组的区别

  ⑽指向一维数组的指针变量设一维数组为a定义方法:*指针变量名即*P这个p一般指向的一维数组的首地址,即p=a,或者p=&a。例子:main(){inta=%d

  ⑾,i,*pa);pa++;}}二、指向二维数组的指针变量设一维数组为a定义方法:(*指针变量名)“长度”表示二维数组分解为多个一维数组时,一维数组的长度,也就是二维数组的列数。、多维数组有关概念注意a表示的都是对应那行的数组首地址,和数组名,而不是一个元素多维数组地址的表示方法设有整型二维数组a+j=*(a+i)+j,由于*(a+i)+j是二维数组a的i行j列元素的首地址。该元素的值等于*(*(a+i)+j)。

  ⑿那么指针和二维数组的关系是什么啊,怎样用指针表示二维数组啊

  ⒀没有关系。指针和数组时两种不同的东西,数组对象之所以有时候用起来像是指针,是因为编译系统做了自动转换。指针表示二维数组?*(p+)+这个样子?

  ⒁C++二维数组与指针的通用关系

  ⒂#defineNUM_ROWS=#defineNUM_COLS=宏定义时用空格分隔变量与定义的值的而不是赋值的方式#defineNUM_ROWS#defineNUM_COLS

  ⒃C语言中关于二维数组与指针的关系

  ⒄修改后代码如下。。。我测试过了。。。。希望对你有帮助。。。。。#include《stdio.h》#include《stdio.h》voidmain(){inta,i,j,k=,m,n;int(*p)=a;printf(“entern(n《)“);scanf(“%d“,&n);if(n%==)m=n/;elsem=n/+;for(i=;i《m;i++){for(j=i;j《n-i;j++)*(*(p+i)+j)=++k;for(j=i+;j《n-i;j++)*(*(p+j)+(n-i-))=++k;for(j=n-i-;j》=i;j--)*(*(p+n-i-)+j)=++k;for(j=n-i-;j》=i+;j--)*(*(p+j)+i)=++k;}for(i=;i《n;i++){for(j=;j《n;j++)printf(“%d“,*(*(p+i)+j));printf(“

  ⒅请问二级指针,二维数组,数组指针的区别

  ⒆//解答如下二级指针:指向指针的指针,它存放的是一级指针的地址。int?*p;int?**q;q?=?&p;??//把一级指针p的地址赋值给二级指针q。二维数组:int?arr;??//定义了一个行列的数组数组指针:指向数组的指针。int?arr;int?(*p);??//指针p是指向数组的指针,你可以理解为指针p是二维数组的行指针。p=arr;还有一种就是指针数组,即数组元素都是指针变量int?*p;int?**q;q=p;?//二级指针q指向了指针数组p的首元素,它的首元素是指针p。

  ⒇二维数组与指针、指针数组、数组指针的用法

  ⒈二维数组和指针⑴用指针表示二维数组元素。要用指针处理二维数组,首先要解决从存储的角度对二维数组的认识问题。我们知道,一个二维数组在计算机中存储时,是按照先行后列的顺序依次存储的,当把每一行看作一个整体,即视为一个大的数组元素时,这个存储的二维数组也就变成了一个一维数组了。而每个大数组元素对应二维数组的一行,我们就称之为行数组元素,显然每个行数组元素都是一个一维数组

  ⒉下面我们讨论指针和二维数组元素的对应关系,清楚了二者之间的关系,就能用指针处理二维数组了。设p是指向二维数组a的指针变量,则有:

  ⒊如果定义int(*p);

  ⒋则p+j将指向a。由于a,指针的一般形式如下:p+iN+j相应的如果用p来表示,则为(p+i)+j元素a相应的指针表示为:(p+iN+j)相应的如果用p来表示,则为((p+i)+j)同样,a也可使用指针下标法表示,如下:p[iN+j]例如,有如下定义:inta={{,,,,},{,,,},{,,,}};则数组a有个元素,分别为a。若有:intp=a;则数组a的元素a对应的指针为:p++元素a也就可以表示为:(p++)用下标表示法,a表示为:p[+]特别说明:对上述二维数组a,虽然a数组的首元素,对其进行“”运算,得到的是一个数组元素值,即a数组首元素值,因此,a。对a进行“”运算,得到的是一维数组a的首地址,即a与a是同一个值。当用intp;定义指针p时,p的指向是一个int型数据,而不是一个地址,因此,用a对p赋值是正确的,而用a对p赋值是错误的。这一点请读者务必注意。⑵用二维数组名作地址表示数组元素。另外,由上述说明,我们还可以得到二维数组元素的一种表示方法:对于二维数组a,其a数组由a+指向,以此类推。因此,a与a等价、(a+)与a等价、(a+)与a,用数组名a的表示形式为:((a+i)+j)指向该元素的指针为:*(a+i)+j数组名虽然是数组的地址,但它和指向数组的指针变量不完全相同。

  ⒌第一,指针变量的值可以改变,即它可以随时指向不同的数组或同类型变量,而数组名自它定义时起就确定下来,不能通过赋值的方式使该数组名指向另外一个数组。

  ⒍第二,数组名是指针,类型是指向元素类型的指针,但值是指针常量,声明数组时编译器会为声明所指定的元素数量保留内存空间。数组指针是指向数组的指针,声明指针变量时编译器只为指针本身保留内存空间。

  ⒎例求二维数组元素的最大值。

  ⒏该问题只需对数组元素遍历,即可求解。因此,可以通过顺序移动数组指针的方法实现。main(){inta={{,,,},{,,,},{,,,}};intp,max;for(p=a,max=p;p《a+;p++)if(p》max)max=p;printf(“MAX=%d/n“,max);}执行结果:MAX=这个程序的主要算法都是在for语句中实现的:p是一个int型指针变量;p=a是置数组的首元素地址为指针初值;max=p将数组的首元素值a+是将指针的变化范围限制在个元素的位置内;p++使得每比较一个元素后,指针后移一个元素位置。例求二维数组元素的最大值,并确定最大值元素所在的行和列。本例较之上例有更进一步的要求,需要在比较的过程中,把较大值元素的位置记录下来,显然仅用上述指针移动方法是不行的,需要使用能提供行列数据的指针表示方法。main(){inta={{,,,},{,,,},{,,,}};intp=a,max,i,j,row,col;max=a;row=col=;for(i=;i《;i++)for(j=;j《;j++)if((p+i+j)》max){max=(p+i+j);row=i;col=j;}printf(“a=%d/n“,row,col,max);}程序运行结果:a=⑶行数组指针在上面的说明中我们已经知道,二维数组名是指向行的,它不能对如下说明的指针变量p直接赋值:inta={{,,,},{,,,},{,,,}},p;其原因就是p与a的对象性质不同,或者说二者不是同一级指针。C语言可以通过定义行数组指针的方法,使得一个指针变量与二维数组名具有相同的性质。行数组指针的定义方法如下:数据类型(指针变量名);例如,对上述a数组,行数组指针定义如下:int(p);它表示,数组p有个int型元素,分别为(p)、(p)、(p)、(p),亦即p指向的是有个int型元素的一维数组,即p为行指针

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

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

  ⒒二维数组有所谓静态数组和动态数组之分。.静态数组,即你的代码所使用的例子,编译期间期数组大小就已经固定。.动态数组,即用指针的指针实现。其大小可以在运行时动态创建。动态数组例子:

您可能感兴趣的文章:

相关文章