C语言入门(第三天:函数、指针)

一、函数

1.1 函数概述

  • 作用:提高代码的编写效率,实现对代码的重用

  • 函数使用步骤

    • 定义函数

      • 理解为制作工具,工具只需要制作1次即可

    • 调用函数

      • 理解为使用工具

1.2 无参无返回值

1.3 有参无返回值(重点)

  • 函数参数的作用:增加函数的灵活性

    • 可以根据需求在调用函数时, 通过参数传入不同的数据

1.4 有参有返回值

1.4.1 返回值基本语法(重点)
  • 函数返回值的作用:函数外部想使用函数内部的数据

1.4.2 返回值注意点
  • return的作用是结束函数

    • 函数内,return后面的代码不会执行

1.5 函数的声明

  • 如果函数定义代码没有放在函数调用的前面,这时候需要先做函数的声明

  • 所谓函数声明,相当于告诉编译器,函数是有定义的,再别的地方定义,以便使编译能正常进行

  • 注意:一个函数只能被定义一次,但可以声明多次

1.6 函数案例

需求:自定义一个函数,返回2个整数的最大值

1.7 局部和全局变量

1.7.1 局部变量
  • 定义在函数内部的变量称为局部变量(Local Variable)

  • 局部变量的作用域(作用范围)仅限于函数内部, 离开该函数后是无效的

    • 离开该函数后,局部变量自动释放

1.7.2 全局变量
  • 在所有函数外部定义的变量称为全局变量(Global Variable),它的作用域默认是整个程序,也就是所有的源文件

1.8 多文件编程(重点)

  • 把函数声明放在头文件xxx.h中,在主函数中包含相应头文件

  • 在头文件对应的xxx.c中实现xxx.h声明的函数

防止头文件重复包含:

  • 当一个项目比较大时,往往都是分文件,这时候有可能不小心把同一个头文件 include 多次,或者头文件嵌套包含。

  • 为了避免同一个文件被include多次,C/C++中有两种方式。

  • 方法一:

#ifndef __SOMEFILE_H__ 
#define __SOMEFILE_H__ 

// 声明语句 

#endif
  • 方法二(嵌入式不能用):

#pragma once // 声明语句

头文件包含的区别:

  • <> 表示系统直接按系统指定的目录检索

  • "" 表示系统先在 "" 指定的路径(没写路径代表当前路径)查找头文件,如果找不到,再按系统指定的目录检索

多文件编程运行结果出现中文乱码:在命令行输入:chcp 65001 再编译执行。

二、指针

2.1 基本语法

2.1.1 指针变量的定义和使用(重点)
  • 指针也是一种数据类型,指针变量也是一种变量

  • 指针变量指向谁,就把谁的地址赋值给指针变量

2.1.2 通过指针间接修改变量的值
  • 指针变量指向谁,就把谁的地址赋值给指针变量

  • 通过 *指针变量 间接修改变量的值

2.1.3 const修饰的指针变量

  • 语法格式

    int a = 1;
    const int *p1 = &a;	// 等价于 int const *p1 = &a;
    int * const p2 = &a;
    const int * const p3 = &a;

    从左往右看,跳过类型,看修饰哪个字符

  • 如果是*, 说明指针指向的内存不能改变

  • 如果是指针变量,说明指针的指向不能改变,指针的值不能修改

2.1.4 指针大小
  • 使用sizeof()测量指针的大小,得到的总是:4或8

  • sizeof()测的是指针变量指向存储地址的大小

    • 在32位平台,所有的指针(地址)都是32位(4字节)

    • 在64位平台,所有的指针(地址)都是64位(8字节)

2.1.5 指针步长
  • 指针步长指的是通过指针进行递增或递减操作时,指针所指向的内存地址相对于当前地址的偏移量。

  • 指针的步长取决于所指向的数据类型。

    • 指针加n等于指针地址加上 n 个 sizeof(type) 的长度

    • 指针减n等于指针地址减去 n 个 sizeof(type) 的长度

2.1.6 野指针和空指针
  • 指针变量也是变量,是变量就可以任意赋值

  • 任意数值赋值给指针变量没有意义,因为这样的指针就成了野指针

    • 此指针指向的区域是未知(操作系统不允许操作此指针指向的内存区域)

  • 野指针不会直接引发错误,操作野指针指向的内存区域才会出问题

  • 为了标志某个指针变量没有任何指向,可赋值为NULL

    • NULL是一个值为0的宏常量

2.1.7 多级指针
  • C语言允许有多级指针存在,在实际的程序中一级指针最常用,其次是二级指针。

2.2 指针和函数

2.2.1 函数参数传值
  • 传值是指将参数的值拷贝一份传递给函数,函数内部对该参数的修改不会影响到原来的变量

2.2.2 函数参数传址(重点)
  • 传址是指将参数的地址传递给函数,函数内部可以通过该地址来访问原变量,并对其进行修改。

总结:
   /**
     * 函数概念:把具有某些功能的代码 封装到一起
     * 函数作用:提高带的复用率
     * 函数的类型:无参无返回值  有参无返回值   有参 有返回值的
     * 函数的返回类型: void  int ……  ---->return 数据类型 就是你的函数的返回类型
     * 局部变量和全局变量
     * 局部变量:定义在{}中的变量  生效的范围 也是在{}中    生命周期:{}代码执行完  变量就销毁了
     * 全局变量:定义在函数外部的变量  生效的范围 是整个文件  生命周期 :程序执行完成
     * 指针:是一种数据类型  int *p      int 类型的指针 p是指针变量名称  指针指向的是地址空间
     * int a = 10; int *p = &a;
     * 输出指针的值 *p  输出地址是 p
     * 通过指针修改变量的值
     * int a = 10; int *p = &a; *p = 23;
     * const 修饰谁 谁就不能修改  (跳过类型)  const int *p  *p 不能修改 p可以修改
     * 指针的大小:
     * 看平台 32还是64  32 4字节  64 8字节  指针大小通过sizeof 查看
     * 步长:
     * 步长是指针增加或者减少1个单位的偏移量  步长和类型有关系 char 步长 1字节  int 步长 4字节
     * 野指针:给指针赋值一个未知地址空间   不能修改空间地址的值  编译会报错
     * 空指针:定义一个未指向任何地址的指针   可以使用NULL初始化  空指针  #define NULL 0
     * 多级指针:例如:二级指针可以存储一级指针变量的地址  三级指针,可以存储二级指针变量的地址
     *
    */
  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值