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

[复制链接]
查看11 | 回复5 | 2018-4-12 23:56:51 | 显示全部楼层 |阅读模式
#include
#define ROWS 3
#define COLS 4
int sumrows(int **,int,int);
int main(){

int ar[ROWS][COLS]={

{5,6,7,8},

{1,2,3,4},

{10,2,4,2}

};

sumrows((int **) ar,ROWS,COLS);

printf("%p=========%p",ar,(int **)ar);

return 0;
}
void sumrows(int **ar,int rows,int cols){

int i,j,tal=0;

for(i=0;i<rows;i++){

for(j=0;j<cols;j++){

//正确

printf("%d\n",*((int *)ar+i*COLS+j));

//编译通过,访问报错

//printf("%d\n",*(*(ar+i)+j));

}

}
}
这是为什么?

回复

使用道具 举报

千问 | 2018-4-12 23:56:51 | 显示全部楼层
这个问题,如果手把手的教,恐怕才好理解;不过,这里我会尽量给你讲清楚的。首先,你要分清楚,数组类型,和指针类型,的区别,然后再看二维的inta[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;上面是指针和数组的相同,下面是他们的不同:sizeo
回复

使用道具 举报

千问 | 2018-4-12 23:56:51 | 显示全部楼层
本程序一共两个错误1.你形参ar定义的是一个int**的类型,实参ar传递进来表示里面只能存放“指向数组首地址的指针变量”的地址,你将这个地址+1,只表示将这个指针变量(用来存放数组首地址)自身的地址+1,并不表示指向数组下一个地址。(这种操作导致了内存越界)。而你 printf("%d\n",*((int *)ar+i*COLS+j));这句话正确是因
回复

使用道具 举报

千问 | 2018-4-12 23:56:51 | 显示全部楼层
c/c++里面函数的传递会将数组退化为指针,所以int**传给sumrows之后,就几乎变成一个int*了,*(ar+0)的值直接为5,所以不能进行二元访问。你可以先在外面循环遍历,将取得的值在传入函数,这样一样可以进行你的试验,呵呵
回复

使用道具 举报

千问 | 2018-4-12 23:56:51 | 显示全部楼层
二维数组即a[j],如a[1][1]是第一行第一列的那个数;指针只是指向了这个数所在的地址,没有具体指出那个数.他们的区别 一个是指向具体的数,一个是执行了该数所在的地址
回复

使用道具 举报

千问 | 2018-4-12 23:56:51 | 显示全部楼层
数组名ar只是一个地址,*(*(ar+i)+j));它里面的 *(ar+i)是取得ar+i地址所对应的值,并非二维数组合法地址,此值再加j实际上是一个普通的值,而并非数组地址,所以才会出错。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行