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

作者&投稿:钭径 (若有异议请与网页底部的电邮联系)

下面简单了解下二维数组的组成(引用的是《c语言入门经典》的图): 

从图中可以看出,board作为二维数组是由两层构成的,第一层为纵向数组,第二层为横向数组。 
也就是说board是纵向数组的首地址,也就是纵向数组的第一个元素board[0]的地址。这就解释了board的值为什么等于&board[0]的值。而(board+i)就是对数组的第i的元素进行访问,所以*board就是*(board+0),就是board[0]。

第二层每个子数组里面由包含了各自的横向的一维数组,所以从这个角度上来说,board[0]这时候就成了数组名了,它包含了board[0][0]、board[0][1]、board[0][2]这三个元素。所以数组名board[0]就是数组的第一个元素board[0][0]的地址,即&board[0][0]。即board[0]与&board[0][0]的值是一样的。 
又因为上面第一层的解释中我们已经知道了board[0]的值与board、*board、&board[0]相等。所以说上面程序中的五条输出语句的结果是一样的。

好了,说了那么多。不知道听晕了没有。总之,二维数组是由两层构成的。 
其本质是因为二维数组在内存里面是连续存储的,即board[0][0] 
一直到board[2][2]这九个数都是一个个紧挨着的。牢记这句话,这与一维指针数组是不一样的。

一维指针数组

先定义一个一维字符指针数组,

char *a[3]={"monday","tuesday","wednesday"};   

printf("&a[][]:%d
",&a[0][0]);   

printf("a[0][0]:%c
",a[0][0]);   

printf("&a[0]:%d
",&a[0]);   

printf("a:%d
",a);   

printf("&a:%d
",&a);  

printf("a[0]:%d
",a[0]);1234567

下面是输出 

可以看出a和&a、&a[0]结果一样,但是&a[0][0]与其他不一样。这与二维数组是不同的。正如我们之前所见的,二维数组的输出都是一样的。 
首先我们要理解char a[3]的含义,这是定义了一个一维数组,数组名为a, 共有三个元素,且元素的类型是char *型。那么我们很清楚了,a是一维数组的名字,也是数组的首地址,所以与&a相等,也与数组的第一个元素的地址&a[0]一样。而a[0]是一个char型的指针变量,指针变量里面存放的是地址。而我们知道的通常情况下指针如int *p=&a,p和&p的内容是不一样的,p放的是要访问的变量a的地址,而&p是指针p的自己的内存地址,两者不一样。所以类似的,&a[0]与a[0]不是同一个东西。a[0]放的是“monday”这个字符串的地址,也就是’m’的地址,所以&a[0][0]即m的地址与a[0]是一样的,都为4216712。



二维数组拥有两个维数相乘那么多同类型的元素,一维指针数组只有维数那么多个某类型的指针元素。这二者似乎没有可比性,维数不同,元素类型一般也不同。

指针指向一维数组和二维数组表示有什么区别~

*(p[0]+1)所代表的数组元素是a[1][1] a是二维数组,p是数组指针,经p[0]=a[1];后p[0]表示aa[1][0]

数组指针(也称行指针)
定义 int (*p)[n];
()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。
如要将二维数组赋给一指针,应这样赋值:
int a[3][4];
int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]

所以数组指针也称指向一维数组的指针,亦称行指针。

指针数组
定义 int *p[n];
[]
优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这
样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地
址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。
如要将二维数组赋给一指针数组:
int *p[3];
int a[3][4];
p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针
for(i=0;i<3;i++)
p[i]=a[i]
这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]
所以要分别赋值。

这样两者的区别就豁然开朗了,数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。
还需要说明的一点就是,同时用来指向二维数组时,其引用和用数组名引用都是一样的。
比如要表示数组中i行j列一个元素:
*(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j]

优先级:()>[]>*

C语言中*p[ ]是什么意思
答:(*p)[]则不同,首先它是一个指针,然后,它指向一个数组,但通常,再定义的时候需要指定所指向数组的大小。示例:include <STDIO.H> int main(int argc, char *argv){ char a[10]="test";char *(p[])={"hello","world!"};//char指针数组,两个元素,分别指向hello和world printf("%s\...

指针与数组的区别和联系是什么?
答:数组可以存任何类型的数据,但不能存函数。\x0d\x0a既然它们之间没有任何关系,那为何很多人把数组和指针混淆呢?甚至很多人认为指\x0d\x0a针和数组是一样的。这就与市面上的C语言的书有关,几乎没有一本书把这个问题讲透彻,\x0d\x0a讲明白了。\x0d\x0a指针和数组的对比\x0d\x0a...

C 语言指针的指针和二维数组的区别?
答:补充说明下隐式转化为指针,简单说就是这样(T是任意类型)设有一个数组T a[10];a的类型是“T [10]”,在做大多数运算的时候,都先隐式转化为“T *”类型,即T的指针 对于多维数组,可以看做是一个一维数组,数组的元素类型就是第二维开始的数组类型,比如:T a[10][20][30];是一个有...

C语言,有如下定义: int a[2][3],(*pa)[3]=a;不是定义一个二维数组a么...
答:这样就可以理解pa=a的意义了,由于数组a的首地址实际上相当于a[0]这个一维数组的首地址,因此pa指向的是a[0][0]的地址,即&a[0][0]使用指向数组的指针的好处是,可以把数组作为一个整体,如pa++或pa=pa+1会让pa的值变为&a[1][0],而不是&a[0][1]与指针数组的区别是:指向数组的...

数组和指针的区别
答:数组是以某种类型为单位的连续的一段内存空间作为存储区域,其中存储相应的数据。其变量名代表数组起始空间地址,也就是首元素的地址。指针是的本质是内存中某一字节的地址,其存储在变量名所对应的内存空间中。之所以说数组的本质是指针,是因为在在具体实现上,数组是基于指针实现的,编译器只提供了数组...

C语言,有如下定义: int a[2][3],(*pa)[3]=a;不是定义一个二维数组a么...
答:这样就可以理解pa=a的意义了,由于数组a的首地址实际上相当于a[0]这个一维数组的首地址,因此pa指向的是a[0][0]的地址,即&a[0][0]使用指向数组的指针的好处是,可以把数组作为一个整体,如pa++或pa=pa+1会让pa的值变为&a[1][0],而不是&a[0][1]与指针数组的区别是:指向数组的...

C中的数组名指针怎么理解?
答:,把一维的指针二维化(好好体会)这也说明二维数组在内存中也是线性而已,只是按行存的(下面有举例)(当然指针和数组还是有区别的,不过对该问题没影响,所以就不要给你乱上乱了)先给你讲讲二维数组吧如:int A[3][4];<---定义了一个3行2列的数组你可以这样想像它的内存是这样分布的:A...

指针数组和数组指针的区别
答:指针数组可以作为函数的参量使用,使用方式与普通数组类似。指针数组常适用于指向若干字符串,这样使字符串处理更加灵活方便。数组指针是指向数组首元素的地址的指针,其本质为指针。指针数组是数组元素为指针的数组,其本质为数组。应用上的区别 指针数组一般用于处理二维数组,指向一维数组的指针变量用于处理...

c 指针数组和多维数组指针变量联系与区别
答:类型说明符 (*指针变量名)[长度]其中“类型说明符”为所指数组的数据类型。“*”表示其后的变量是指针类型。“长度”表示 二维数组分解为多个一维数组时,一维数组的长度,也就是二维数组的列数。应注意“(*指 针变量名)”两边的括号不可少,如缺少括号则表示是指针数组,意义就完全不同了。一个数...

关于指针、数组的理解
答:两者区别:前者是地址(p+2)指向的内容加3的值。后者是地址p指向的内容加2再加3后的值。如果前面有写 p=a 那么语句就是正确的的。p=a后,p是指向a【0】的指针,对指针p+2后,它对应的地址是a【2】的地址,所以,p+2=&a【2】,那么*(p+2)就等于a【2】了。a【2】相当于引用数组...