函数的设计应该遵从什么原则?
答:我们说函数就是一种封装的方法,函数的设计应该遵从“一个函数仅实现一个功能”的原则,这样子我们就可以实现化繁为简的目标,将一个复杂的程序给拆解开来,变成一个个独立的功能,每个功能我们就用一个函数来实现。
“形参和实参,只是放在不同位置的同一个变量。”,这种说法正确吗?
答:不正确。它们是不同的两个变量,只是函数在调用的过程中,发生了类似“形参 = 实参”的赋值操作。
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。