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

《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’。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张无印

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值