参数和指针

函数的设计应该遵从什么原则?

答:我们说函数就是一种封装的方法,函数的设计应该遵从“一个函数仅实现一个功能”的原则,这样子我们就可以实现化繁为简的目标,将一个复杂的程序给拆解开来,变成一个个独立的功能,每个功能我们就用一个函数来实现。

“形参和实参,只是放在不同位置的同一个变量。”,这种说法正确吗?

答:不正确。它们是不同的两个变量,只是函数在调用的过程中,发生了类似“形参 = 实参”的赋值操作。

void 类型的函数能否使用 return 语句返回?

答:可以。

解析:在有返回值的函数中,return 语句的作用通常是返回函数的执行结果,并结束当前函数,让 CPU 回到调用它的位置;在没有返回值的函数中也可以使用 return 语句,例如当检查到一个错误的时候提前结束函数并返回。

下面是 strcpy 函数的原型(参考文档请戳:传送门),请问为何第二个参数要使用 const 修饰?

char *strcpy(char *dest, const char *src);

答:dest(Destination)参数指向用于存放字符串的目标数组,src(Source)参数指向待拷贝的源字符串。dest 参数是 char * 类型,而 src 参数是 const char * 类型,说明dest 所指向的内存空间在函数中是可以改写的,而 src 所指向的内存空间在函数中只能读不能写。

请问下面这两个函数的定义等价吗?

func(int a[], int n)
{
        ……
}

func{int *a, int n}
{
        ……
}

答:以上两种写法是等价的。因为函数不存在传递(拷贝)整个数组的情况,当用数组名做实参时,传递的实际上是数组第一个元素的地址。因此,形参是一个指向数组元素类型的指针。

请问下面代码中,变量 a 和变量 b 的值打印出来分别是多少?为什么?

#include <stdio.h>

void get_array(int b[10]);

void get_array(int b[10])
{
        int i;

        printf("sizeof b: %d\n", sizeof(b));
}

int main()
{
        int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};

        printf("sizeof a: %d\n", sizeof(a));
        get_array(a);

        return 0;
}

答:事实上这是课堂中的一段演示代码,不过我怕你没认真听课漏掉了这一关键的知识点,所以再问了一次。好吧,打印的值应该是 40 和 4(在小甲鱼的编译环境中,一个整型变量占 4 个字节的内存空间)。

为什么会这样的?

来,我们敲黑板划重点:并不存在将整个数组作为参数传递的方式,传递的实际上是指向这个数组的第一个元素的地址而已。

请问下面代码会打印什么?

#include <stdio.h>

void func(int b[][3]);

void func(int b[][3])
{
        printf("%d\n", b[2][2]);
}

int main(void)
{
        int a[3][4] = {
                {1, 2, 3, 4},
                {5, 6, 7, 8},
                {9, 10, 11, 12}
        };

        func(a);

        return 0;
}

答:9。

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

倦504

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

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

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

打赏作者

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

抵扣说明:

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

余额充值