指針做函數參數——高效C語言

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,要搞清楚給你提供環境的框架是什麼?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章