指针数组是2维数组吗 二维数组和一维指针数组的区别

作者&投稿:郯享 (若有异议请与网页底部的电邮联系)
不是。

指针是指针,数组是数组。它们用法很相似,但逻辑上并不是一体,从面象对象角度看,两者区别极大。

只从使用上说,指针很容易发生内存违规,而数组有限。
指针是栈操作,而数组是堆操作。

所以指针数组也不是2维数组。

指针数组的是几维的,要看怎么声明了,跟普通的数组一样,只是他们的元素是指针,声明的时候,前面多了个*号。

比如:
int *p[3],a[2];//p是一维的指针数组,a是一维的数组
int *p[3][2],a[2][3];//p是二维的指针数组,a是二维的数组

有二维有一维,多维也可以,只是每个单元格里面存的是指针罢了

2维和指针数组是两回事
指针数组可以看成指针的一维数组
数组的维数要看[]的个数
a[i] 一维

a[i][j] 二维

不是,完全不是,指针数组就是一个容纳指针的顺序存储结构,无他。

coid *p[];

数组指针和指针数组的区别~

数组指针(也称行指针)
定义 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语言入门经典》的图):
从图中可以看出,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。

下列能够正确表示数组元素a[1][2]的表达式是
答:D 两个知识点:1、二维数组的数组名,可以看作类型是指向第二维子数组的指针,比如int a[4][3];a的类型是int (*)[3],即指向int [3]数组的指针。2、p[i]等价于*(p+i)。由这两点可知,int (*prt)[3]=a的话,prt和a在使用上就是一样的了。a[1][2]就是ptr[1][2],利用知识点...

为什么C语言中二维数组的数组名a和*a表示的是同一个值?
答:当定义二维数组a[M][N]时,数组名可以认为是二维指针,其指向二维数组的首地址。于是a的值就是首地址的值。而*a,就是a[0],a[0]是第一行的标记,代表第一行的首地址。在二维数组中,所有元素都是紧密排列的,这样整个数组的首地址,第一行的首地址,和第一个元素的首地址,即a, a[0], ...

数组指针是2级指针吗
答:不一定。指向一维数组的指针是普通指针(是不是1级指针?)。指向二维数组的是指向指针的指针(是不是二级指针?)。

2维数组的数组名代表什么,求大神解
答:在C或C++中,他代表一个指针,初始时指向(0,0)的位置,比如:int a[][] 中a指向的位置等同于a[0][0]。在没有指针的语言,如JAVA、C#中他就是一个对象的名称,你可以用它来调用数组的方法,如(JAVA)中:int[][] a = new int[2][3];System.out.println(a.length);

二维数组的定义是什么?
答:二维数组定义的一般形式是: 类型说明符 数组名常量表达式1其中常量表达式1表示第一维下标的长度,常量表达式2 表示第二维下标的长度。二维数组基本运算算法:(1)转置矩阵:1 // 其中A, B是m*n矩阵2 void tramat(matrix A, matrix B) { //T(n) = O(m * n)3 int i, j;4 for (i =...

数组的定义是什么?
答:因此,二维数组的逻辑结构是:每个元素至多有两个直接前驱和两个直接后继。在C语言中,二维数组一般定义为:数组名[下标][下标]。2)n维数组在n维数组中,每个数据元素对应n个下标,受n个关系的制约,其中任一个关系都是线性关系,也可被看作数据元素为n-1维数组的一维数组。在C语言中多维数组...

二维数组是什么?
答:二维矩阵就是,由矩阵里面的每个元素不再是单一的数,而是一个个有序实数对,在几何上则对应二维平面上的点构成的。二维数组 二维数组本质上是以数组作为数组元素的数组,即“数组的数组”,类型说明符 数组名[常量表达式][常量表达式]。二维数组又称为矩阵,行列数相等的矩阵称变方阵。对称矩阵a[i][j...

inta[2]是几个维数组
答:二维。在c语言中,“inta2”中只有两个元素,表示二维数组。数组是用于储存多个相同类型数据的集合。数组的产生来源于C语言中,数组属于构造数据类型。

C语言指针 急急急!! int *pa[3]={a[0],a[1],a[2]};
答:每个pa元素指向一个int数组(int*[]),比下面的要好,对代码起了注释的作用 int (*pa)[3] --- pa是一个指向数组的指针,所指涉的数组含有三个int元 素。所以 pa 是指向int数组的指针,每个pa元素是“二 级指针 (int**)”,而不是“二维指针”,一维的二级真 针 如果我在面试你,你写了...

指向二维数组的指针问题2
答:整型占几个字节,谁也不知道,你只能在运行的时候用 sizeof(int) 来计算。TC 是 16 位的,它的 int 就是 2 个字节,dev-c++ 是 32 位的,它的 int 就是 4 个字节。第2个问题:只有减 没有加 没有为什么。。。