指针做函数参数——高效C语言
2015-10-03 11:20
363 查看
1.指针做函数参数——高效
2.思维扩展,谁为main()函数初始化环境,准备的内存空间?
定义函数接口
1.void PrintArray_1(int a[10]);
2.void PrintArray_2(int a[], int len);
3.void PrintArray_3(int *pArray, int len);//效率最高,编译器维护成本最低,一个指针加上一个int len。
需求2:打印一个二维数组的各个元素
定义函数接口
编译器忽略数组长度,只需要知道数组内存空间首地址即可完成数组的打印。
分析以下程序,打印菜单内容,运行时出错?why?
分析以下程序,打印操作系统环境变量信息,一切正常,why?
分析:指针数组env内容是操作系统提供的,menu_content是用户提供的。
虽然都没有给编译器提供数组内容长度信息(后者的长度信息会被编译器忽略)。
但打印操作系统环境变量信息时,程序运行正常,说明指针数组内容最后一个元素是NULL(‘\0’,0均可),以终止循环打印。
修改如下:
char* menu_content[] = {
“open”,
“copy”,
“cut”,
“exit”,
‘\0’
};
**总结:由于C编译器追求高效,忽略数组长度信息,一般都需要提供一个额外的长度信息,如:argv,argc。 还有一种办法就是对指针数组本身做手脚,通过添加’\0’,NULL,0标识数组长度信息,隐含传递给调用者。
————————————————————————**
2.思维扩展,谁为main()函数初始化环境,准备的内存空间?
指针做函数参数
需求1:打印一个一维数组的各个元素定义函数接口
1.void PrintArray_1(int a[10]);
2.void PrintArray_2(int a[], int len);
3.void PrintArray_3(int *pArray, int len);//效率最高,编译器维护成本最低,一个指针加上一个int len。
#include <stdio.h> void PrintArray_3(int *pArray, int num) { int *p = pArray; for (int i = 0; i < num; i++) { printf("%d\t", p[i]); } } void main() { int a[10] = { 8 }; PrintArray_3(a,sizeof(a)/sizeof(*a)); system("pause"); }
需求2:打印一个二维数组的各个元素
定义函数接口
1.void PrintArray_1(int a[10][10]); 2.void PrintArray_2(int a[][10], int len); 3.void PrintArray_3(char*(*pArray)[], int len);//效率最高,编译器维护成本最低,一个数组指针加上一个int len。 4.void PrintArray_4(int *pArray, int len);//效率最高,编译器维护成本最低,一个指针加上一个int len。
编译器忽略数组长度,只需要知道数组内存空间首地址即可完成数组的打印。
分析以下程序,打印菜单内容,运行时出错?why?
#include <stdio.h> #include <stdlib.h> void PrintMenuContent(char* p[]) { for (int i = 0; p[i] != NULL; i++) { printf("%s\n", p[i]); } } void main() { char* menu_content[] = { "open", "copy", "cut", "exit" }; PrintMenuContent(menu_content); system("pause"); }
分析以下程序,打印操作系统环境变量信息,一切正常,why?
#include <stdio.h> #include <stdlib.h> void main(int argc, char* argv[], char* env[]) { int i =0; printf("******************* Begin argv *******************\n"); for (i = 0; i<argc; i++) { printf("%s\n", argv[i]); } for(i=0; argv[i]!=NULL; i++) { printf("%s\n", argv[i]); } printf("******************* End argv *******************\n"); printf("******************* Begin Print env *******************\n"); for (i = 0; env[i] != NULL; i++) { printf("%s\n", env[i]); } printf("******************* End Print env*******************\n"); system("pause"); }
分析:指针数组env内容是操作系统提供的,menu_content是用户提供的。
虽然都没有给编译器提供数组内容长度信息(后者的长度信息会被编译器忽略)。
但打印操作系统环境变量信息时,程序运行正常,说明指针数组内容最后一个元素是NULL(‘\0’,0均可),以终止循环打印。
修改如下:
char* menu_content[] = {
“open”,
“copy”,
“cut”,
“exit”,
‘\0’
};
**总结:由于C编译器追求高效,忽略数组长度信息,一般都需要提供一个额外的长度信息,如:argv,argc。 还有一种办法就是对指针数组本身做手脚,通过添加’\0’,NULL,0标识数组长度信息,隐含传递给调用者。
————————————————————————**
思维扩展,谁提供的内存?
main函数的参数列表很有意思,看到指针做函数参数,要想到的是指针背后对应的内存是谁准备好的?你在公司干活,平台和环境当然是公司为你提供的。在软件世界里,你的平台和环境是谁提供的?MFC,QT,IOS,Linux ,Android还是普通App,要搞清楚给你提供环境的框架是什么?相关文章推荐
- 【Cpp】删除字符串空格
- Bjarne Stroustrup announces C++ Core Guidelines
- 顺序表的实现C++封装
- c++ primer 练习5.22
- c语言的正则表达式
- c++ primer 练习5.21
- C语言中函数参数为什么是由右往左入栈的?
- c++ primer 练习5.20
- C/C++堆区、栈区、常量区、静态数据区、代码区详解
- C++ STL vector assign用法
- C语言快速入门系列-详解
- C++primer学习:顺序容器(2)
- 软件工程(C编码实践篇)介绍
- leetcode笔记:Path Sum II
- 项目26.4个人所得税计算器switch语句
- C/C++中static关键字总结
- VS中的路径宏 vc++中OutDir、ProjectDir、SolutionDir各种路径
- 【C++】c++实现线性表、链表
- 【C++知识点】可重载与不可重载的操作符
- 项目26.3 本月有几天?