2024年9月二维数组指针区别(二维数组与指针、指针数组、数组指针的用法)
⑴二维数组指针区别(二维数组与指针、指针数组、数组指针的用法
⑵二维数组与指针、指针数组、数组指针的用法
⑶二维数组和指针⑴用指针表示二维数组元素。要用指针处理二维数组,首先要解决从存储的角度对二维数组的认识问题。我们知道,一个二维数组在计算机中存储时,是按照先行后列的顺序依次存储的,当把每一行看作一个整体,即视为一个大的数组元素时,这个存储的二维数组也就变成了一个一维数组了。而每个大数组元素对应二维数组的一行,我们就称之为行数组元素,显然每个行数组元素都是一个一维数组
⑷下面我们讨论指针和二维数组元素的对应关系,清楚了二者之间的关系,就能用指针处理二维数组了。设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)=,返回的是数组的总空间
⒀二维数组的指针,某一行的指针,某一元素的指针各代表什么含义
⒁int(*p)=a;
⒂首先,数组首地址值=行首地址值=第一个元素地址值,注意只是值相等,重要的是类型不同.记住:地址类型很重要.
⒃数组地址类型,其中n为列宽,表示一行中包含n个int元素,此处为,即个int元素组成一行,并将其看成一个整体,int的数据宽度是字节,因此一行(整体)有*=个字节.此类指针每次递增即递增个字节
⒄指针值都是字节的,区分不同类型的目的就是为了指示:指针指向的内存的数据宽度,即该指针指向的地址开始存放的数据是多少字节的,进而实现数据对齐.
⒅a是个数组,“a“这个标识符映射为常量指针,其类型为int(*),指向数组首地址,因此可以直接赋值给p.
⒆注意p的数据宽度也是*=,如果p++,那么递增的是个字节.所以这种类型的指针也称为行指针,因为以行为基本单位.
⒇因此,二维数组指针就是行指针.
⒈单个int类型元素的指针,也可以作为一维数组的指针,同样原因:数据宽度一致,都是字节.
⒉因此a表示数组首行,而行数据是个int型的一维数组,因此其类型为int*,所以可以直接赋值.
⒊同样a表示数组首行首元素,因此取地址后也可以直接赋值给int*类型指针.
⒋最后再次重申,解读指针定义或者分析右值类型时,数据宽度是关键所在.
⒌附图显示数组首地址值=行首地址值=第一个元素地址值,但是类型是不同的.
⒍数组指针的指向一维数组和二维数组的区别
⒎指向一维数组的指针变量设一维数组为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)。
⒐关于二维数组和一维指针数组的区别
⒑这是两个概念。二维数组和一维数组比较:例如inta,这样访问。不同的地方:a就是第个数。说道一维指针数组,int*d没有区别,b里边存了个int值,而d里边存了个int地址。地址也是值,只是我们通常不直接用这个地址,而是用这个地址指向的值。d中存了个值,值的类型是地址,个地址指向个别的地方(也有可能相同,看开发的人怎么设置的。如果我们用的时候,intd=;d;*号是取值符号。如果你把int*当做一个整体,其实int*d,和intb是一样的。
⒒二维数组和一维指针数组的区别
⒓下面简单了解下二维数组的组成(引用的是《c语言入门经典》的图:
⒔从图中可以看出,board作为二维数组是由两层构成的,第一层为纵向数组,第二层为横向数组。?也就是说board是纵向数组的首地址,也就是纵向数组的第一个元素board。
⒕第二层每个子数组里面由包含了各自的横向的一维数组,所以从这个角度上来说,board的值是一样的。?又因为上面第一层的解释中我们已经知道了board相等。所以说上面程序中的五条输出语句的结果是一样的。
⒖好了,说了那么多。不知道听晕了没有。总之,二维数组是由两层构成的。?其本质是因为二维数组在内存里面是连续存储的,即board?一直到board这九个数都是一个个紧挨着的。牢记这句话,这与一维指针数组是不一样的。
⒗先定义一个一维字符指针数组,
⒘char*a={“monday“,“tuesday“,“wednesday“};
⒙printf(“&a);
⒚printf(“a);
⒛printf(“&a);
printf(“a:%d
printf(“&a:%d
printf(“a);
可以看出a和&a、&a与其他不一样。这与二维数组是不同的。正如我们之前所见的,二维数组的输出都是一样的。?首先我们要理解chara是一样的,都为。
请问二级指针,二维数组,数组指针的区别
//解答如下二级指针:指向指针的指针,它存放的是一级指针的地址。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。
二维数组与动态生成的指针数组在使用上有什么区别
指针数组需要释放空间。.二维数组元素是分配在连续空间中的,所以可以当一位数组来用,比如传入函数什么的。在这意义上,指针数组是伪二维数组.指针数组可以改变任何一个指针对应的一维数组的大小,这是二维数组做不到的。
普通指针变量与指向二维数组的指针变量有什么区别
中文译得比较绕人,简单说数组的指针本质是指针,指针数组本质是个数组。数组指针:apointertoanarray,即指向数组的指针指针数组:arrayofpointers,即用于存储指针的数组,也就是数组元素都是指针还要注意的是他们用法的区别,下面举例说明。int(*a)数组指针表示:指向数组a的指针元素表示:(*a)int*a指针数组表示:数组a中的元素都为int型指针元素表示:*a优先级高于*
C语言指针的指针和二维数组的区别
从实际使用上来说,没有区别,int**s;//给**s分配一系列内存//访问时一样用二维数组的方式:s