您的位置:首页 > 其它

二维数组及二维指针的传递及一些思考

2014-05-04 12:11 176 查看
二维数组和二位指针在程序知识中是一个难点,往往会将人弄得头昏眼花。总结一下这个难点的相关问题。

二维数组,顾名思义就是数组的数组;二维指针是指针的指针。首先,我们来看看二维数组和二维指针等价的问题。

在《C专家编程》10.3节的小启发里讲的很透彻:(以下这段文字及对比一定要认真分析!)

数组和指针参数是如何被编译器修改的?

数组名被改写成一个指针参数”规则并不是递归定义的。数组的数组会被改写成“数组的指针”,而不是“指针的指针”:

实参 所匹配的形参

数组的数组 char c[8][10]; char (*)[10]; 数组指针

指针数组 char *c[10]; char **c; 指针的指针

数组指针(行指针) char (*c)[10]; char (*c)[10]; 不改变

指针的指针 char **c; char **c; 不改变

可仔细体会一下上述表格,如果能理解,那是极好的,如果不能,我将举个栗子来帮助理解。

栗子1:

#include <stdio.h>
#include <string.h>

void func(char **ptr)
{
char arry[6][30] =
{
"ABCDEFG",
"HIJKLMN",
"OPQ",
"RST",
"UVW",
"XYZ",
};
ptr = arry;
}

int main(int argc, char *argv[])
{
char **ptr = NULL;
func(ptr);
printf("%s\n", ptr);
return 0;
}


这个栗子不多解释,完全错误的传递。

栗子2:

#include <stdio.h>
#include <string.h>

void func(char **ptr)
{
char *arry[30] =
{
"ABCDEFG",
"HIJKLMN",
"OPQ",
"RST",
"UVW",
"XYZ",
};
ptr = arry;
}

int main(int argc, char *argv[])
{
char **ptr = NULL;
func(ptr);
printf("%s\n", ptr);
return 0;
}


此例中,prt = arry,正确,但是main函数不会返回arry的内容。

栗子3:

#include <stdio.h>
#include <string.h>
#include <malloc.h>

void func(char **ptr)
{
char arry[6][30] =
{
"ABCDEFG",
"HIJKLMN",
"OPQ",
"RST",
"UVW",
"XYZ",
};
memcpy(ptr, arry, sizeof(arry));
}

int main(int argc, char *argv[])
{
char **ptr = NULL;
ptr = (char **)malloc(180);
func(ptr);
printf("%s\n", ptr);
free(ptr);
return 0;
}


能返回arry[0].

栗子4:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: