您的位置:首页 > 其它

作为函数参数的多维数组想到的两个问题

2012-05-28 12:53 393 查看
《C和指针》中对多维数组作为函数的参数有这个的描述:

作为函数参数的多维数组名的传递方式和一维数组名相同——实际上传递的是个指向数组第一个元素的指针。但是,两者之间的区别在于,多维数组的每个元素本身是另外一个数组,编译器需要知道它的维数,以便为函数形参的下标表达进行求值。

这个论述,对于一般的int形二维数组,并没有什么异议;但对于字符串数组,情况似乎就有点不同了。下面有一个例子:

#include <unistd.h>
#include <stdio.h>

int main(void)
{
char *choise[] =
{
"test choise 1",
"this is test choise 2",
NULL
};
print(choise);
}

int print(char **ps)
{
char **pp = ps;
while (*pp)
{
printf("%s\n", *pp);
pp++;
}
}
这段程序如果按照上面所述的规则,在执行print函数中pp++时,程序应该是不能正常运行的,可结果是程序可以正确打印出字符串。

对于一个字符串数组,本身就是一个字符形的二维数组,但它也有它自己的特殊性,就是字符串是以'\0'为结尾的字符数组。也就是说,choise这个二维的数组的每个子数组是以'\0'结尾的,这样,就可以告诉编译器参数ps的维数,print函数的形参相当于char (*ps)[22]。

在这段程序里,还有一个小问题,就是NULL和“”的区别。NULL是什么都没有,就是0。""是一个空字符串,空字符串也是字符串,它只有一个字符‘\0’。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐