首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

处置二维数组的函数的一个疑问

2012-09-21 
处理二维数组的函数的一个疑问为什么数组的行可以再函数调用时传递,但是列却只能被预置在函数内部?二者能

处理二维数组的函数的一个疑问
为什么数组的行可以再函数调用时传递,但是列却只能被预置在函数内部?二者能不能倒过来呢?还有个疑问是二维数组的名和指向的指针之间是否可以通用呢,我看到书上没有把二者区分开来啊,貌似都可以用,请解释一下。谢谢。

[解决办法]
1.
int a[][3]={1,2,3,4,5,6};//实际上成了 int a[2][3]={1,2,3,4,5,6};
如果: int a[2][]={1,2,3,4,5,6};//可能是:int a[2][3]={1,2,3,4,5,6};或者int a[2][4]={1,2,3,4,5,6};或者int a[2][5]={1,2,3,4,5,6};这就不确定了


[解决办法]
数组在作为函数参数传递时等价于首元素指针
二维数组可以理解为“一个一维数组,它的每一个元素都是一个一维数组”
传递二维数组时,实际上传递的是“一个元素为一维数组的一维数组的首元素的指针”,所以需要“将列数预置在函数内部”
说白了,当你传递a[3][4]到一个函数里,实际上你传递的是一个指针,这个指针指向int[4]类型的数据

二维数组以至于多维数组实际上是很纠结的东西,我到现在也没想明白这东西有哪里好
也许是各人风格不同吧,反正我从来只用一维数组,因为多少维的数组本质上都是连续内存,跟一维数组等价
[解决办法]
如果一个数组定义为
int a[10][5];
那么调用时
a[2][3] //第二行第三列
就等于
*(a+2*10+3)
//数组首元素地址偏移2*10+5,
//这里的10是在数组定义时确定的,
//因为已经指定每行有10个元素,
//而2和3是调用时确定的
//只有定义时指定每行的元素数才能在调用时正确计算出地址
数组名和指针在有些情况下时通用的,数组名即指向数组第一个元素的指针
函数传参时传递数组名会自动转换成指针
如果需要传递二维数组,书上有的使用指针的指针是有问题的,而且传递后也不能直接当作二位数组用
比如
void fun(int** a)
{int b = a[2][3];}
是错误的,因为编译器不知道如果计算a[2][3]元素的地址
[解决办法]
仅供参考

C/C++ code
//在堆中开辟一个4×5的二维int数组#include <stdio.h>#include <malloc.h>int **p;int i,j;void main() {    p=(int **)malloc(4*sizeof(int *));    if (NULL==p) return;    for (i=0;i<4;i++) {        p[i]=(int *)malloc(5*sizeof(int));        if (NULL==p[i]) return;    }    for (i=0;i<4;i++) {        for (j=0;j<5;j++) {            p[i][j]=i*5+j;        }    }    for (i=0;i<4;i++) {        for (j=0;j<5;j++) {            printf(" %2d",p[i][j]);        }        printf("\n");    }    for (i=0;i<4;i++) {        free(p[i]);    }    free(p);}//  0  1  2  3  4//  5  6  7  8  9// 10 11 12 13 14// 15 16 17 18 19
[解决办法]
除了第一维可以忽略,其他维度必须全部指定, 这是C语言基础, 并且其道理也是明摆着的, 防止歧义.

热点排行