第8章函数十个问题
2017-10-19 09:52
120 查看
1. 函数调用中,地址传递为什么说形参与实参占用同样的存储单元?
因为实参传的是那段地址,形参接受的也是这段地址,相同的地址,当然就是相同的存储单元,存储单元就是地址的意思
2. 如果C++程序要调用已编译后的C函数,该怎么办?
假如一个C函数的声明如下
void foo(int x,int y);
该函数被C编译器编译后再库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字来支持重载和类型安全连接,由于编译后的名字不同,C++程序不能直接调用C函数。C++提供了一个C连接交换指定符号extern
“C”来解决这个问题
3. main()
的返回值返回到那里?
返回给操作系统,表示程序正常退出。因为return
语句通常写在程序的最后,不管返回什么值,只要到达这一步,说明程序已经运行完毕。而return的作用不仅在于返回一个值,还在于结束函数
4. 为什么有的编译器不支持void main()?
有些编译器允许这种形式,但是还没有任何标准考虑接受它。标准的C语言要求main函数的返回值是int,该值是执行程序时,告知主调进程程序运行结果的一个渠道。由于大多数时候,程序运行结果可以由其它方式确定,比如程序打印信息,所以main的返回值变得不重要,于是大部分编译器都支持无返回值类型的main,这时默认返回给主调进程0值
5. 二维数组如何作为函数参数使用?
二维数组作形参有三种形式:
void func(int mat[][4]);传递一个二维数组,其中第二维的大小不能省略;
void func(int(*p)[4]);
这里定义一个指针p,这个指针p指向的是一个数组,这个数组的长度是4,也可以这么理解,p指向的是二维数组中的每一行
void func(int **p);
定义一个指针的指针,使用这种形式要注意一些问题,就是在计算每行元素的首地址时,以及具体某个元素位置的地址时候,需要进行强制类型转换才行
6. 怎样让函数返回数组?
C++中函数是不能直接返回一个数组的,但是数组就是指针,所以可以让函数返回指针来实现。不能直接返回函数中定义的数组,会被释放掉。
7. 回调函数有哪些具体应用?
使用回调函数实际上就是在调用某个函数时,将自己的一个函数(这个函数为回调函数)
的地址作为参数传递给那个函数。而那个函数在需要的时候,利用传递的地址调用回调函数。
8. 有哪些变参函数?
典型的可变参数函数的例子有printf(),scanf()等
9. 变参函数如何取参数?
C语言支持可变参数函数,即参数的个数可以是不定个,在函数定义的时候用(...)表示,比如我们常用的printf()等;printf函数的原型如下:
int printf(const char *format,...);
注意,采用这种形式定义的可变参数函数,至少需要一个普通的形参,比如上面代码中的*format,后面的省略号是函数原型的一部分。
10. 函数声明放在主函数外和主函数内有什么区别?
放在主函数外,从它的位置往下,所有的函数都能调用该函数;
而在主函数内,只有主函数能访问该函数
因为实参传的是那段地址,形参接受的也是这段地址,相同的地址,当然就是相同的存储单元,存储单元就是地址的意思
2. 如果C++程序要调用已编译后的C函数,该怎么办?
假如一个C函数的声明如下
void foo(int x,int y);
该函数被C编译器编译后再库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字来支持重载和类型安全连接,由于编译后的名字不同,C++程序不能直接调用C函数。C++提供了一个C连接交换指定符号extern
“C”来解决这个问题
3. main()
的返回值返回到那里?
返回给操作系统,表示程序正常退出。因为return
语句通常写在程序的最后,不管返回什么值,只要到达这一步,说明程序已经运行完毕。而return的作用不仅在于返回一个值,还在于结束函数
4. 为什么有的编译器不支持void main()?
有些编译器允许这种形式,但是还没有任何标准考虑接受它。标准的C语言要求main函数的返回值是int,该值是执行程序时,告知主调进程程序运行结果的一个渠道。由于大多数时候,程序运行结果可以由其它方式确定,比如程序打印信息,所以main的返回值变得不重要,于是大部分编译器都支持无返回值类型的main,这时默认返回给主调进程0值
5. 二维数组如何作为函数参数使用?
二维数组作形参有三种形式:
void func(int mat[][4]);传递一个二维数组,其中第二维的大小不能省略;
void func(int(*p)[4]);
这里定义一个指针p,这个指针p指向的是一个数组,这个数组的长度是4,也可以这么理解,p指向的是二维数组中的每一行
void func(int **p);
定义一个指针的指针,使用这种形式要注意一些问题,就是在计算每行元素的首地址时,以及具体某个元素位置的地址时候,需要进行强制类型转换才行
6. 怎样让函数返回数组?
C++中函数是不能直接返回一个数组的,但是数组就是指针,所以可以让函数返回指针来实现。不能直接返回函数中定义的数组,会被释放掉。
7. 回调函数有哪些具体应用?
使用回调函数实际上就是在调用某个函数时,将自己的一个函数(这个函数为回调函数)
的地址作为参数传递给那个函数。而那个函数在需要的时候,利用传递的地址调用回调函数。
8. 有哪些变参函数?
典型的可变参数函数的例子有printf(),scanf()等
9. 变参函数如何取参数?
C语言支持可变参数函数,即参数的个数可以是不定个,在函数定义的时候用(...)表示,比如我们常用的printf()等;printf函数的原型如下:
int printf(const char *format,...);
注意,采用这种形式定义的可变参数函数,至少需要一个普通的形参,比如上面代码中的*format,后面的省略号是函数原型的一部分。
10. 函数声明放在主函数外和主函数内有什么区别?
放在主函数外,从它的位置往下,所有的函数都能调用该函数;
而在主函数内,只有主函数能访问该函数
相关文章推荐
- 第八章函数十个问题及解答
- <笔记><算法导论> 假设求解问题的算法需要f(n)毫秒,对下表中的每个函数f(n)和时间t,确定可以在时间t内求解的问题的最大规模n。
- 函数返回值问题
- QT信号槽的六个优点(虽然直接调用函数也可解决问题,但要在具体的函数中传递指针,多对一和解除关系也够麻烦的)
- 指针的十个问题
- 数组作为函数形参时应注意的问题
- oracle cast() 函数问题
- Java编码易疏忽的十个问题
- 关于System.out.printf()函数 4000 出错问题
- 由Point p1 = p和p1 = p的区别想到的关于copy构造函数和赋值操作符重载函数的调用时机问题
- 解决react native使用fetch函数在ios9报network request failed的问题
- 虚函数问题
- js中一个函数获取另一个函数返回值问题探讨
- javascrip setInterval 函数在一个对象内部的调用问题
- 关于gettimeofday函数的使用问题
- oracle的SQL语句中同一函数执行的时间问题
- 做的第一个大数问题,头疼在memset()函数:A + B Problem II
- python学习之路——函数关于可变对象和不可变对象问题
- 函数PYXX_READ_PAYROLL_RESULT的dump问题
- 升级Win10前后的十个常见问题 你躺枪了吗?