• C和指针


    一. 快速上手

    1. 逻辑上删除一段程序:

    #if 0

      statements

    #endif

    2. printf函数:%d十进制整型值、%o八进制、%x十六进制、%g浮点值、%c字符、%s字符串

     scanf函数:%d整型值、%ld长整型、%f浮点数、%lf双精度、%c字符、%s字符串

    3. char *strchr(char* dest, char src) => 返回src字符在dest字符串中第一次出现的位置

     char *strstr(char* dest, char* src) => 返回src字符串在dest字符串中第一次出现的位置

    二. 基本概念

    1. cc -c test.c main.c将源文件test.c、main.c编译生成目标文件test.o和main.o;  cc test.o main.o链接几个目标文件

    2. int ch; while((ch = getchar()) != EOF){ putchar(ch) };

    三. 数据

    1. 可以把字符串常量赋值给一个“指向字符的指针”,但是不能把字符串常量赋值给一个字符数组,因为字符串常量的直接值是一个指针,而不是这些字符本身。

    2. char *message = "Hello World";(把message声明为一个指向字符的指针,并用字符串常量中的第一个字符的地址作为其值初始化)相当于char *message; message = "Hello World";

    3. typedef出现在定义前面 char *ptr_to_char; typedef char *ptr_to_char; ptr_to_char a;将a声明为指向字符的指针

    四. 语句

    1. while( scanf("%f", &value) == 1 && value >= 0){}

    2. switch(expression) {case constant-expression:} //expression的结果必须是整型值,constant-expression必须是常量表达式

    3. switch(ch)

    {

      case ' ': line += 1;

          /* FALL THRU */fall through表明ch贯穿所有case,当满足 时除了执行line+=1,下面的words+=1和chars+=1都会执行

      case ' ':

      case '': words += 1;

          /* FALL THRU */

      default: chars +=1;

    }

    4. c不具备布尔类型,用整型表达式代替

    5. c不具备任何I/O输入/输出语句,c也不具备任何异常处理语句,这些都是通过调用库函数实现的。

    五. 操作符和表达式

    1. 将指定位数置1:value |= (1 << bit_number);将指定位数置0:value &= (~(1 << bit_number));判断指定位数是否为0:value &= (1 << bit_value)

    2. 逗号表达式的值为整个表达式最右边的值。if(b-10, c+4, d>0)//从左往右依次执行,但整个表达式的值为d>0

    3. 下标引用:array[ 下标 ] 等价于 *(array + (下标))

    4. lexp代表左值,左值代表一个位置,rexp代表右值,右值代表一个值,在左值的地方不能使用右值,在右值的地方可以使用左值

    5. 大写转小写:#include <ctype.h> tolower(ch);

    六. 指针

    1. 硬件通过地址访问内存位置,编译器帮我们实现通过变量访问内存位置

    2. 值的类型并非值本身所固有的特性,而取决于它的使用方式

    3. 变量的值就是分配给该变量的内存位置所存储的值,即使是指针变量也不例外

    4. 段违例:segmentation violation;内存错误:memory fault

    5. 在特定数组中查找某个特定值得函数:返回状态值表示是否找到,如果找到,再返回指向该值得指针

    6. 在对指针进行解引用操作/间接访问之前,必须确保指针不是NULL指针

    7. *(int *)100 = 25;将整型强制转换为指向整型的指针,用于访问设备控制器接口

    8. *p+1表示*p的值加1;*(p+1)表示p指向的地址加1后取值;p+1表示指针指向下一个地址

    9. char ch;char *cp = &ch; *cp++//①++操作符产生cp的拷贝②++操作符再增加cp的值③最后在cp的拷贝上执行间接访问操作。

     当表达式*cp++作为左值时表示ch的内存位置,作为右值时表示ch的值

    10. 当指针初始化为常量字符串时无法进行字符交换,只有当指针指向字符数组时才可以实现交换。

    七. 函数

    1. 字符串查找:if(strcmp(value, string) == 0)

    2. 可变参数的函数:stdarg.h头文件;一个类型va_list;三个宏va_arg, va_start, va_end;

    float average(int n_values, ...)

    {

      va_list var_arg;

      int count;

      float sum;

      var_start(var_arg, n_values);//准备访问可变参数

      for(count = 0; count < n_values; count++)

      {

        sum += va_arg(var_arg, int);

      }

      va_end(var_arg);

      return sum/n_values;

    }

    3. 

    2. 432 154

  • 相关阅读:
    [基础]RHEL6下LINUX服务器批量部署
    delphi 连接 c++ builder 生成obj文件
    Delphi基本图像处理代码
    Delphi 版本号(D1到XE6),发现一个delphi.wikia.com网站
    Delphi常用排序
    Delphi中用Webbrowser加载百度地图滚轮失效(ApplicationEvents里使用IsChild提前判断是哪个控件的消息)
    判断连个单链表是否交叉,并找到交叉点
    窗体自适应屏幕分辨率
    Zlib压缩算法在Java与Delphi间交互实现(压缩XML交互)
    开机自动启动程序的几种方法
  • 原文地址:https://www.cnblogs.com/embeddedking/p/9752023.html
Copyright © 2020-2023  润新知