作为函数参数的多维数组想到的两个问题
2012-05-28 12:53
393 查看
《C和指针》中对多维数组作为函数的参数有这个的描述:
作为函数参数的多维数组名的传递方式和一维数组名相同——实际上传递的是个指向数组第一个元素的指针。但是,两者之间的区别在于,多维数组的每个元素本身是另外一个数组,编译器需要知道它的维数,以便为函数形参的下标表达进行求值。
这个论述,对于一般的int形二维数组,并没有什么异议;但对于字符串数组,情况似乎就有点不同了。下面有一个例子:
对于一个字符串数组,本身就是一个字符形的二维数组,但它也有它自己的特殊性,就是字符串是以'\0'为结尾的字符数组。也就是说,choise这个二维的数组的每个子数组是以'\0'结尾的,这样,就可以告诉编译器参数ps的维数,print函数的形参相当于char (*ps)[22]。
在这段程序里,还有一个小问题,就是NULL和“”的区别。NULL是什么都没有,就是0。""是一个空字符串,空字符串也是字符串,它只有一个字符‘\0’。
作为函数参数的多维数组名的传递方式和一维数组名相同——实际上传递的是个指向数组第一个元素的指针。但是,两者之间的区别在于,多维数组的每个元素本身是另外一个数组,编译器需要知道它的维数,以便为函数形参的下标表达进行求值。
这个论述,对于一般的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’。
相关文章推荐
- C++中数组以及多维数组作为函数参数时的一些问题
- 一维或多维数组作为函数参数的问题
- 多维数组作为函数参数的形式
- C++用指针变量作为函数的参数接受数组的值的问题详细总结
- 如何将多维数组作为参数传递给函数?(以二维数组为例)
- C语言中数组作为函数参数的问题
- C++多维数组:存储方式、访问方式和作为函数参数
- 学习心得——数组作为函数参数后sizeof获取不到数组在内存中所占字节数的问题
- QT 自定义信号与信号槽方法及解决自定义数据类型或数组作为函数参数的问题
- C语言中实参和形参问题&&函数使用数组作为参数的问题
- 学习心得——数组作为函数参数后sizeof获取不到数组在内存中所占字节数的问题
- C/C++学习之C提高----C数组的定义、类型、定义数组指针变量、多维数组的本质、多维数组做函数参数、将两个数组中的字符串copy到第三个数组
- C++多维数组:存储方式、访问方式和作为函数参数
- 数组作为函数参数时的传递问题
- QT 信号槽connect中解决自定义数据类型或数组作为函数参数的问题——QT qRegisterMetaType 注册MetaType——关键:注册自定义数据类型或QMap等容器类
- C/C++面试题--数组作为函数参数的几个问题
- 函数指针、多维数组作为函数参数
- 多维数组做函数参数问题
- 关于 Numpy 数组作为函数参数的一个小问题
- 数组作为函数参数的指针问题