Linux C第七课

指针与数组的区别

1.从空间分配来说,数组是静态分配,指针式动态分配。
2.从访问效率来说,数组是直接访问,访问效率高;指针是间接访问,效率低。
3.从安全性来说,操作不当时数组会造成越界,野指针会造成内存泄漏。
4.从函数形参来说,传一维数组用元素指针,传二维数组用一维数组指针,以此类推;传指针用指针的指针。
5.从处理对象来说,数组偏向于值的处理,指针偏向于计算机地址的处理。
6.从空间连续性来说,数组对应的空间一定是连续的,指针指向的空间不一定是连续的。

常见的内存错误及对策

(我们常用printf、gdb来调试内存错误)
1.内存分配未成功,却使用了
2.内存虽然分配成功,但使用前没有初始化
3.内存分配成功且正确初始化,但操作越界了
4.使用完以后没有释放内存,造成内存泄漏
5.使用了已经释放的内存

函数

*函数内部尽量减少使用其他函数
*使用函数的好处
提高了代码的复用性、维护性、可扩展性

*函数的三要素:函数名,形参,返回值
1.函数名
*函数名要起到自注释性,提高代码的可读性
*下划线连接的字符不能超过5个,通常用简易的动词加名词
*函数名即函数的存储地址,也是函数的入口地址
*执行函数的过程
①根据函数名找到函数的入口地址
②给函数形参分配空间
③传值:把实参对应的内存空间的值传给形参
④执行函数里面的语句
2.形参
*如何确定传值还是传地址
①当要修改实参变量的值,就要传地址
①当只要使用实参变量的值,只要传值
*传入参数、传出参数
传入参数:原本没有值,通过调用函数,带出变量的值
传出参数:原本有值,通过调用函数来使用该值
3.返回值
*函数返回值不要使用局部变量的地址

char * func()
{
    char *ptr = "hello";
    char src[100] = "hello";

    return ptr;//能正常输出,因为ptr中保存的是字符常量'h'的地址,所以不会被释放
    //return src; //不能正常输出,因为src中保存的是局部变量的地址
}

*当程序出现异常,要抛出异常,并给出提示信息
①exit(1);给用户反馈,异常退出;结束时返回值为1,可以自定义;该函数包含在stdlib.h这个头文件中;功能是结束整个程序。
②return 0;给系统的反馈;系统检查程序是否是正常退出,用return 0;
*用 echo $? 相当于 printf当前程序的返回值;例,exit(1); 输出的值就为 1 。

函数指针

我们通过一个简单的程序来理解函数指针

#include<stdio.h>

int add(int a,int b)
{
    return a + b;
}

int sub(int a,int b)
{
    return a - b;
}

int mul(int a,int b)
{
    return a * b;
}

int cal(int (*func)(int,int),int a,int b)
{
    return func(a,b);
}

int main()
{
    int a = 5;
    int b = 6;
    int result;
    int (*func_arr[3])(int,int);
    //函数指针数组,保存多个函数的地址

    int (*p_func)(int,int);//函数指针 
    p_func = add;//该函数指针里面保存的是add函数的地址

    result = p_func(a,b);

    printf("result = %d\n",cal(add,a,b));

    /*分别为函数指针数组里面的每个元素赋值*/ 
    func_arr[0] = add;
    func_arr[1] = sub;
    func_arr[2] = mul;

    int i;
    /*输出函数指针数组每个函数指针指向的函数的返回值*/
    for(i = 0;i < 3;i++)
    {
        printf("func_arr[%d] = %d\n",i,func_arr[i](a,b));
    }

   result = cal(add,a,b);//此处的add可以换为mul、sub等。这些函数称为回调函数
   printf("result = %d\n",result);
    return 0;
}

*回调函数
函数指针做形参,这个函数指针指向的函数称为回调函数

主函数参数

*主函数参数也称为命令行参数
*argc:参数的个数;实际参数的个数 argc - 1,因为系统将./a.out 也作为一个参数,而真正的参数只有 argc - 1个
*argv[]:保存参数的数组

#include<stdio.h>
#include<stdlib.h>

int main(int argc,char *argv[])
{
    /*此时有且只能输入一个真正的参数*/
    if(argc != 2)
    {
        printf("please input one param!\n");
        exit(1);
    }

    printf("argc = %d\n",argc);

    int i;
    /*打印所有参数*/
    for(i = 0;i < argc;i++)
    {
        printf("argv[%d] = %s\n",i,argv[i]);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值