zoukankan      html  css  js  c++  java
  • 实习第一个月总结(const关键字、条件编译、volatile关键字、#和##的作用、函数指针)

    C语言中const关键字的作用:

    • 修饰局部变量或者全局变量,表示变量n的值不能被改变了
    • 修饰指针,分为常量指针与指针常量,也可以两者结合
      • 常量指针指向的值不能改变,但是这并不是意味着指针本身不能改变,常量指针可以指向其他的地址
      • 指针常量是指指针本身是个常量,不能在指向其他的地址

    区分常量指针和指针常量的关键就在于星号的位置,我们以星号为分界线,如果const在星号的左边,则为常量指针,如果const在星号的右边则为指针常量。如果我们将星号读作‘指针’,将const读作‘常量’的话,内容正好符合。int const * n;是常量指针,int *const n;是指针常量。

    • 修饰函数的返回值,如果给以“指针传递”方式的函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。 
    const char * GetString(void);
    
    如下语句将出现编译错误:
    char *str = GetString();
    
    正确的用法是
    const char *str = GetString();

     条件编译:

    猜一下哪段代码会被编译进去,强调下是编译进去,不是执行

    #define XXX 0
    
      // 第一段条件编译
      #ifdef XXX
        逻辑1
      #else
        逻辑2
      #endif
    
      // 第二段条件编译
      #if XXX
        逻辑1
      #else
        逻辑2
      #endif

     答案

    • 第一段条件编译:逻辑1会被编译进去
    • 第二段条件编译:逻辑2会被编译进去

    总结

    • #if既关心宏是否定义,又关心宏的逻辑的真假
    • #ifdef(#if defined())、#ifndef(#if !defined())仅仅关心宏是否被定义,不关心宏的逻辑真假

     函数名可用于表示函数的地址。

    联合体每次只能存储一种类型的数据,联合体的大小为其中最大数据类型的大小,同时也要满足字对齐的要求。联合体的使用方法和结构体的使用方法一样。


    volatile关键字:在C语言中volatile关键字可以用来提醒编译器它后面所定义的变量随时有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。

    Java语言中:参考https://www.cnblogs.com/ustc-anmin/p/11434769.html


     Git操作,删除untracked files: git clean -xfd


    C语言宏定义中#符号和##的妙用

    一、 宏定义可以包含两个专用的运算符:#和##。编译器不会识别这两个运算符,他们会预处理时被执行。

    #运算符的用法
        (1)#运算符用在预编译时期,用于将宏参数转换为字符串,即是加上双引号。
    ##运算符的使用
          (1)##运算符用于在预编译期粘连两个符号,增大了宏的使用灵活性!
    #include<stdio.h>
    #define PRINT_MACRO_HELPER(x) "123#x"#x 
    #define PRINT_MACRO(x) PRINT_MACRO_HELPER(x) 
    #define PRINT_ANOTHER_MACRO(x) #x"="PRINT_MACRO_HELPER(x) 
     
     
    int main()
    {   int i=982366632;
        char *str=PRINT_MACRO_HELPER(1235982536); 
        char *str2=PRINT_MACRO(32423); 
        //char *str3=PRINT_MACRO(i); 
        char *str3=PRINT_ANOTHER_MACRO(i); 
        printf("the string of str is %s,the string of str2 is %s ,the string of str3 is %s
    ",str,str2,str3);
        printf("%s
    ","i love android!"); 
       return 0;
    }
    the string of str is 123#x1235982536,the string of str2 is 123#x32423 ,the string of str3 is i=123#xi
    i love android!

     函数指针:函数名本身就是一个指针

    #include <stdio.h>
    
    void dayinnum(int i);
    void (*pf)(int i);
    
    int main() {
        dayinnum(56);
        pf=dayinnum;
        pf(6568);
    
        return 0;
    }
    
    void dayinnum(int i){
        printf("%d
    ",i);
    }

    56
    6568 

  • 相关阅读:
    复习一allure
    本地push 到git hub 二
    项目过程中,测试总感觉自己的时间不够怎么办?
    记一次接口并发,酿成20万损失的惨案
    记录一次管理员组织应用的运行
    记录一次jmeter脚本开发缺少utf-8惹的祸
    记录一次pycharm中,引入其他类可用,下面总是有波浪线,而且Ctrl+b 无法查看类函数的源码
    Fiddler如何过滤无用的链接
    【bat】将当前文件夹及其子文件夹下的所有文件移动到新文件夹中
    python 安装python-docx模块(如何本地安装)
  • 原文地址:https://www.cnblogs.com/ustc-anmin/p/11435132.html
Copyright © 2011-2022 走看看