请问二级指针,二维数组,数组指针的区别 关于二级指针和二维数组的问题

作者&投稿:夕怎 (若有异议请与网页底部的电邮联系)
//解答如下
二级指针:指向指针的指针,它存放的是一级指针的地址。
int *p;
int **q;
q = &p;  //把一级指针p的地址赋值给二级指针q。
二维数组:
int arr[4][5];  //定义了一个4行5列的数组
数组指针:指向数组的指针。
int arr[4][5];
int (*p)[5];  //指针p是指向数组的指针,你可以理解为指针p是二维数组的行指针。
p=arr;
还有一种就是指针数组,即数组元素都是指针变量
int *p[5];
int **q;
q=p; //二级指针q指向了指针数组p的首元素,它的首元素是指针p[0]。


二维数组名与二级指针有什么区别?~

实际上它们是没有任何关系的,那个赋值也不应该通过。以下的解答建立在一定程度的脑补上,实际上这段代码问题相当多。
a的内存布局如下:
-------------------------
| 1 | 2 | 3 | 4 | 5 | 6 |
-------------------------
p[0]结果是一个int*,它的大小凑巧和int相同。p[0]凑巧读到了a[0][0],所以输出1。
a[0]结果是一个int*,但是它是由int[3]退化而来,编译器实际上输出的是&a[0][0]。
换句话说,p假装指向的是一个数组而把那一段内存解释成指针(就像一个int数组一样)。

这个问题,如果手把手的教,恐怕才好理解;不过,这里我会尽量给你讲清楚的。

首先,你要分清楚,数组类型,和指针类型,的区别,然后再看二维的

int a[4]; //a 的类型 int [4], 也就是4个元素的数组类型,它是个地址的概念,首地址,即&a[0]
int *pi; // pi 的类型 int*,整型指针,变量 pi 可以存放个地址
pi = a; //或是 pi = &a[0]; 这里的赋值是可以的;
pi[2] = 321; // 等价于*(pi + 2) = 321; 等价于a[2] = 321;

上面是指针和数组的相同,下面是他们的不同:
sizeof(a): 16 ,4 * 4, 4个int元素,每个元素4个字节;
sizeof(pi): 4,它就是个指针,指针变量都是4个字节;
a + i 等效于 pi + i, 他们都相对于a(或是pi)偏移i个int元素的位置;

下面看二维数组:
int a[3][4];
改写下形式,也许,你就懂了 int (a[3])[4];
a[0], a[1], a[2] //他们都是int [4]的类型,都是4个int元素的首地址,你可以画个图
a // 是 int [3] [4]的类型,它是a[0] , a[1], a[2] ,3个元素的首地址,画个图;

a + 1 就是&a[1] , a + 2 就是&a[2];
*(a + 1 ) + 2 就是 a[1] + 2, 也就是 &a[1][2], 于是 *( *(a + 1) + 2) 就是a[1][2];

现在看二维指针和数组指针,
int * * pi; // pi = a;这里的赋值是不可以的,你懂的,类型不一样,除非你强制转换
int (*pj)[4]; // pj = a; 这里赋值是可以的;数组指针

假设int 4个字节,指针也都是4个字节,而且 pj = pi = 0 (地址十进制)
pi + 1 // 地址是 4,偏移了一个int*的元素,
pj + 1 // 地址是 16,偏移了4 * 4个int元素,

如果,这里的你都看懂了,你问的那个问题,已经不成问题了;
//编译通过,访问报错
//printf("%d
",*(*(ar+i)+j));
ar 什么类型? int ** 类型,而不是int [3][4]这种类型,也不是int (*)[4]这种类型,
你希望ai + i 他偏向 第 i 行,实际上他不会,它只会,向后偏 i 个位置

我感觉要说的,差不多了,你要是想理解,要么再看看书,画画图,或是问问其他同学,我这上面的也不可能讲的生动形象;祝你好运~~~

Visual C++中二级指针的定义,初始化,赋值问题
答:二级指针和二维数组并不等价。二级指针是一个指向指针的指针 而二维数组其实就是一个指针,char a[3][4]; a是指向整个二维数组的首地址。它相当于(char *)[n],并不是char **;所以不能直接:t=a;要这样:t = (char **)a;以下转帖:今日在论坛上看到有人问到指针的问题,我想通过这样的...

c语言中二维数组的指针如何表示
答:int **p;或者 int p[MAX_ROW][MAX_LINE];不同的是前者定义了一个int型二维数组的指针,编写器知道该指针的移动方式以int为单位,但此时该指针为NULL,即没有与内存中的物理单元进行对应。使用指针前需要用malloc()为该指针分配一段内存空间,内存空间的大小在malloc()的参数中指定,系统会为该指针...

二维数组如何用指针表示
答:for(i = 0; i < m; i ++)//遍历每行 r[i] = (int *)malloc(sizeof(int)*n);//每行分配n个int型元素。 return r;//返回地址值。}二、通过数组指针指向已有二维数组。对于已经定义好的M行N列数组,可以使用指向N个元素的数组指针,指向该数组并访问。参考代码:int a[10][5]...

C语言程序设计中"二维数组中元素指针的表示"的例题,求详解
答:二维数组和指针 ⑴ 用指针表示二维数组元素。要用指针处理二维数组,首先要解决从存储的角度对二维数组的认识问题。一个二维数组在计算机中存储时,是按行存储的,即先存储第一行的元素,再存储第二行的元素。当把每一行看作一个整体,即作为一个大的数组元素时,原来的二维数组也就变成一个一维数组了...

关于二级指针遍历二维数组,我这样做问题在哪里?
答:二维数组是由一维数组组成的数组。它的每个元素都是一个一维数组。因此指向二维数组的指针应该是一个数组指针,数组长度等于每个一维数组的长度。char (*p1)[3]=board;

二维数组就是二级指针?
答:数组是数组,是一组数据类型相同的变量的集合;指针是指针,指针是变量在内存中的存储地址。二者不是一个东西,二维数组可以看成是一个矩阵,而二维指针可以看成是“地址的地址”。记住,指针是地址。

二级指针和二维数组行指针的区别
答:一个是指向指针的指针,一个是指向数组的指针,这是从定义上区别,现在我在外面,手机上不便,回去后给你具体的解答。

C语言中二维数组行指针是什么
答:注意:数组名虽然是地址,但与指向数组的指针性质不同。指针变量可以随时改变其所指向对象,而数组名不可以,一旦被定义,就不能通过赋值使其指向另外一个数组,但是在Java中则可以。第三,顺便了解一下不太常用的‘行数组指针’。对于二维数组array[4][3],与int* p 。二维数组名array 不能直接赋值...

C语言中“二维数组行指针”是什么意思?
答:数组名就是一个指针常量,它代表数组元素在内存相关信息。1、C语言 是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。2、C语言的发明 20世纪60年代,美国AT&T公司贝尔实验室(AT&T Bell ...

请教C++二维数组和指针的简单问题。
答:第二题 主要是明白*s[2]这个是什么。其实有两个操作符,一个是解引用操作符*;另外一个是下标操作符[]。查一下优先级吧。应该先是下标操作所以*s[2]变成了*(s[2])。那么s[2]是什么呢?其实由定义char s[4][6]可以明白。s中存放的是指向字符串的指针。s[2]是一个指针,指向一个字符串...