1.指針做函數參數——高效
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,要搞清楚給你提供環境的框架是什麼?