关于二级指针和二维数组的问题 二级指针和二维数组行指针

作者&投稿:禾衬 (若有异议请与网页底部的电邮联系)
这个问题,如果手把手的教,恐怕才好理解;不过,这里我会尽量给你讲清楚的。

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

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\n",*(*(ar+i)+j));
ar 什么类型? int ** 类型,而不是int [3][4]这种类型,也不是int (*)[4]这种类型,
你希望ai + i 他偏向 第 i 行,实际上他不会,它只会,向后偏 i 个位置

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

本程序一共两个错误
1.你形参ar定义的是一个int**的类型,实参ar传递进来表示里面只能存放“指向数组首地址的指针变量”的地址,你将这个地址+1,只表示将这个指针变量(用来存放数组首地址)自身的地址+1,并不表示指向数组下一个地址。(这种操作导致了内存越界)。而你 printf("%d\n",*((int *)ar+i*COLS+j));这句话正确是因为你对ar进行了强制类型转换,将int**转换成了int*,而数组的空间是连续的,所以int*+1是允许的。举个最简单的例子,你一看就懂了。
# include <stdio.h>

int main(void)
{
int a[5] = {1, 2, 3, 4, 5};
int * p = &a[0];
int ** q = &p;
printf("%d", **(q+1));
return 0;
}
这个程序是错误的,因为**(q+1)与*(p+1)并不等价,也就是说与p紧邻的下一块地址不一定存着a数组a[1]的地址。**(q+1)指向了一块系统未分配的内存,从而导致内存越界。
2.第二个错误,难道没有人看出来吗,真不知道你咋编译成功的。函数声明你写的是int sumrows,而下面的又写的是void sumrows,显然不一致啊。

希望给你说明白了。要给分哦

c/c++里面函数的传递会将数组退化为指针,所以int**传给sumrows之后,就几乎变成一个int*了,
*(ar+0)的值直接为5,所以不能进行二元访问。
你可以先在外面循环遍历,将取得的值在传入函数,这样一样可以进行你的试验,呵呵

二维数组即a[i][j],如a[1][1]是第一行第一列的那个数;指针只是指向了这个数所在的地址,没有具体指出那个数.他们的区别 一个是指向具体的数,一个是执行了该数所在的地址

数组名ar只是一个地址,
*(*(ar+i)+j));
它里面的 *(ar+i)是取得ar+i地址所对应的值,并非二维数组合法地址,此值再加j实际上是一个普通的值,而并非数组地址,所以才会出错。

二维数组名不能赋值给二级指针- -~

我理解你的问题是不是这样:int a[3][4]; int**p = a;为什么会报错是吧?

回答:你理解的是对的,但是错在,a是指向一维数组,p是指向int*,这两个不等价。
a指向一维的int数组,内存大小为sizeof(int)*数组长度;
而p只是指向一个int*类型指针,内存大小为4。指针指向的类型实际是不同的。
这里你可能又有疑惑,为啥int b[10]一维数组就可以赋值给int* pb = b呢,这是因为数组退化到指针,只有第一维的数组可以不确定数组长度,可以直接作为首地址。有“数组名能否作为右值”的讨论。
如果想实现指针赋值,可以这样int(*p)[4] = a;
这样定义你就可以理解,p是一个指针,指向int[4]一维数组

二维数组即a[i][j],如a[1][1]是第一行第一列的那个数;指针只是指向了这个数所在的地址,没有具体指出那个数.他们的区别 一个是指向具体的数,一个是执行了该数所在的地址

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

c++中怎么通过指向二维数组的指针给二维数组赋值
答:指向指针的指针称为二级指针,即二级指针不是指向一个普通变量,而是指向一个指针。如int **p,*p并不表示一个变量的值,而是另一个指针。二、二级指针指向二维数组 int a[3][4];此时的a即是一个二级指针,*a指向二维数组的首地址(也是a[0]的首地址),*(a+1)指向a[1]的首地址,*(a+2)...

二维数组和二级指针
答:通过二级指针去访问二维数组需要先给二级指针分配等同于二维数组行数的一维数组指针,然后把二维数组的每行首地址赋值给对应位置的一维指针上。之后就可以通过二维指针直接访问了。参考代码如下,可以看具体注释辅助理解。include <stdio.h>//输入输出头文件。#include <stdlib.h>//本程序需要用到malloc/fre...

c++二维数组和二级指针
答:类型不匹配,a 不是 int ** 类型的 ,虽然一维数组的数组名是一个指针 ,但是二维数组却不同 ,因为它所指向的东西是有大小的 ,举例来说 ,你这个 a 他是 int[2][3] 类型的 , 编译器需要知道要操作的单元的大小,就是说如果你用 p++; 的话编译器要能知道移动多少个字节,所以说可以改...

请问二级指针,二维数组,数组指针的区别
答://解答如下二级指针:指向指针的指针,它存放的是一级指针的地址。int *p;int **q;q = &p; //把一级指针p的地址赋值给二级指针q。二维数组:int arr[4][5]; //定义了一个4行5列的数组数组指针:指向数组的指针。int arr[4][5];int (*p)[5]; //指针p是指向数组的指针,你可以...

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

c++的二级指针和二维数组
答:因为二级指针是指向指针的指针, 也就是说二级指针必须指向一个一级指针, 而这个一级指针存放的是一个内存地址 相信楼主知道一维数组可以看成是一级指针 但是二维数组却不能看成是二级指针 就以a[2][3]举例 a[2][3]其实就是两个维度为3的一维数组合并起来的二维数组, 也可以看成是一个一级数组...

C语言指针与二维数组求解
答:所以回到刚开始那个问题,用我们上面的话说,&a中的a可以表示的是整个数组内容,所以取其地址还是数组地址,当然此时的a也可以理解成地址,但由于a是个二维数组,也就是个二级指针,那么&a就应该是个三级指针了。所以如果要把&a赋值给某个指针变量的话,那它应该是形如char (*p)[2][3]类型的变量了; *a表示的是...

c语言中如何通过二级指针来操作二维数组
答:1、首先我们打开电脑里的C语言软件,新建一个工程和.c文件,输入头文件和主函数。2、然后我们输入图示代码初始化数组,定义变量类型。3、然后我们输入图示代码用for语句实现数组的访问。4、然后我们输入图示代码进行输出。5、然后我们输入图示代码编译、运行,即可通过二级指针来操作二维数组。

c语言 二级指针问题 这个程序里w=b;换成w=c;为什么printf("%s\n",*...
答:w=c;这个用法本来就不建议的,即使编译可以通过。我用最浅显的说法来解释就是,两者是不同类型来的,如果你是初学者,那么记住二维数组不是二级指针,二维数组叫行指针,如果你想深入点理解可以往下看,计算机对你的操作解释如下:1)w=c,那么把c[0][0]的地址写入二级指针w中。2)w+1,对于这句...