预处理 指针基础

预处理:

编译过程:
  1.预处理  
    //预编译 -- 将 代码中相关 预处理命令执行 最终生产一个 只包含c语言代码的文件 
  2.编译 
    //编译   -- 对语法进行检查,将这个c的源代码 生产 汇编代码 
  3.汇编 
    //汇编   -- 表示将 汇编源代码 最终生成 机器代码 //object 
  4.链接
    //链接   -- 将使用到的其它代码了链接到一起 生成 最终可执行文件  

宏定义 :


 #define 标识符 字符串              
    #define 宏名   宏值  
   
   注意:
    1. 预处理命令 都是以 # 开头的 
    2. 宏名 命名规则 和 之前标识符命名规则一致 
       注:宏名一般都写大写 ,以区别与普通变量名 
    3. 预处理 实际上 是将 宏名 用 宏值(预处理阶段的 字符串) 原样替换 
       文本替换 
       注意: c语言字符串中出现的 "宏名" 不会被替换 
           
    4. 应用 
       a. 提高代码可读性   
       b. 一改全改,方便代码修改 
     
    5. 宏名的 作用域
    
    #undef 宏名   表示 取消 宏名的 定义 
    注意:
       只是在预处理阶段发挥作用;
       作用范围:
       从定义处开始,到 #undef 结束

带参宏定义,宏函数

语法:

#define 宏名(参数)#define 宏名(参数) 宏值 

注意:
   1.带参宏 和 函数有本质的    区别
     a.处理阶段不一样 
      宏定义 --预处理阶段 
      函数   --编译阶段 
     b.使用不一样
       宏 :预处理阶段  就使用结束了 
           宏的使用,本质上,是文本的原样替换
           宏的参数,只是进行 文本替换用,不进行语法检查                  
       函数 :调用时,进行使用 
           函数的使用,本质上是函数代码的调用 
      参数: 函数的参数,是有类型的,编译阶段是要进行类型检查的 
                     
    c.应用 
           一般对于一些短小代码 ,考虑写成带参宏
           不超过5行的代码           
    d.宏的副作用 
       处理: 把能加括号的地方都加括号 
    e.注意
      宏定义 必须 写在一行续行符 

2.文件包含 
  #include <文件名>
  #include "文件名"

<> 与 "" 
 区别在于,查找头文件的方式不一样 
   <>  //到系统默认的路径寻找对应的头文件 
   ""  //表示先到当下目录下寻找头文件,如没有,再到系统默认路径下寻找 

3.条件编译       
  (1).
  #ifdef 标识符
    程序段 1
  #else
    程序段 2
  #endif
  含义:
    如果 定义了 标识符 则 预处理程序段1  //就是将程序段1的代码 保留 
  否则保留
      //1.调试代码 
      //2.设计头文件 
  (2)
     #ifndef 标识符
        程序段1
     #else
        程序段2
     #endif
    含义:
     如果 没有定义了 标识,则 预处理 程序段1  //就是将程序段1的代码 保留 
     否则处理 程序段2
        
  (3) 
    #if 表达式
      程序段1
    #else
      程序段2
    #endif
     
    含义:
       表达式为真 处理程序段1 表达式为假 处理程度段2    
  #if 0
   ...
  #endif
  
  
  项目
    |-- main.c
    |-- isLeapYear.c 
    |-- isLeapYear.h
    |-- getDays.c
    |-- getDays.h
    |-- weekFirstDayOfMonth.c
    |-- weekFirstDayOfMonth.h
    |-- printCal.c
    |-- printCal.h
  项目:
    |--main.c
    |--add.c
    |--add.h 
  
    防止多次包含,带来重复定义的问题 


二.指针基础

1.指针的定义包括两部分:
指针类型:指针变量所指向的数据的类型。
指针变量:存储地址的变量。
定义指针的基本语法是:
type *pointer_name;

这里,type 是指针所指向的数据类型,pointer_name 是指针变量的名称。例如:
int *ptr;    // 定义一个指向整数的指针
char *c_ptr; // 定义一个指向字符的指针
c
2. 指针变量的类型

指针变量的类型由它指向的数据类型决定。常见的指针类型包括:
**int ***:指向整数类型的指针。
**float ***:指向浮点数类型的指针。
**char ***:指向字符类型的指针。
**double ***:指向双精度浮点数类型的指针。
**struct type ***:指向结构体类型的指针。
例如:
int num = 10;
int *num_ptr = &num;  // num_ptr 是一个指向整数的指针

char letter = 'A';
char *letter_ptr = &letter;  // letter_ptr 是一个指向字符的指针
c
3. 使用指针

**取地址运算符 &**:用于获取变量的内存地址。
**解引用运算符 ***:用于访问指针所指向的值。
例如:
int value = 20;
int *ptr = &value;  // ptr 指向 value 的地址

printf("Address of value: %p\n", (void*)ptr); // 打印地址
printf("Value at ptr: %d\n", *ptr);           // 打印指针指向的值

三.指针的变量名和引用

指针的变量名

指针的变量名是指针本身的名称,它代表了存储在该指针中的内存地址。例如:
int a = 10;          // 定义一个整型变量a
int *p = &a;        // 定义一个指向整型的指针p,并将a的地址赋值给p


在这个例子中,p就是指针的变量名,它存储了变量a的地址。
指针的引用

在C语言中,"引用"通常不是一个标准术语,但我们可以将其理解为通过指针访问或修改其指向的变量的值。这通常涉及到解引用操作,即使用*运算符来访问指针所指向的值。例如:
printf("%d\n", *p); // 通过指针p访问a的值,输出10

*p = 20;             // 修改p所指向的值(即a的值)
printf("%d\n", a);  // 输出20,a的值被修改

总结

指针的变量名是指向特定类型数据的指针变量的名称。
指针的引用是通过解引用操作符*来访问或修改指针所指向的值。

   


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值