指针做函数参数——高效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,要搞清楚给你提供环境的框架是什么?

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值