C语言入门系列总结

前后花了六天的时间,把C语言"入了个门",之所以是双引号的入门,因为一些认为比较重要、不是特别好理解的知识点,虽然当时理解了,但是印象不深,所以决定还是放慢节奏,今天把前面的总结一下,知识二次加工,提取出重要的内容,后面再去找开源项目通过项目进一步学习和巩固基础知识。

  • sizeof是运算符,用于计算数据类型所占的存储空间
  • 数组遍历的写法
// 动态计算数组的元素个数
    int length = sizeof(scores) / sizeof(scores[0]);
    
    for (int i = 0; i < length; i++) {
        printf("scores[%i] = %i\n", i,scores[i]);
    }
  • 数组的存储和变量有点不一样, 数组存储元素, 是从所占用的低字节开始存储
  • 数组的地址就是数组首个元素的地址,也是数组名的地址。
  • 二进制、八进制、十六进制如何表示和输出
int num2 = 0b1100;//二进制
int num1 = 014;//八进制
int num3 = 0xc;//十六进制

printf("%d\n", num1);//十进制输出
printf("%o\n", num);//八进制输出
printf("%x\n", num);//十六进制输出

十进制转二进制:除2取余 倒序读取

这部分基础内容其实很重要,虽然属于基础,但是在编码的时候,掌握一些位运算的技巧可以优化程序的性能(相对的),缺点就是不易理解。所以需要掌握位运算的特点和规律、位运算的练习也是必要的,但并不紧急。

但是也不必立刻就掌握和记住,用到的时候,或者看其他开源软件源码不理解的时候记得回来翻看,练练就好,没必要死记。

  • 内存中存储的是补码。正数的三码一样,负数的补码等于原码取反加一
  • 将一个整数以二进制方式输出
/*     技巧:
     1.任何数与1相&都是那个数
     2.利用位移取出每一位
*/
void printBinay(int value)
{
    // 1.定义变量需要向右移动的位数
    int offset = 31;
    // 2.通过循环取出每一位
    while (offset >=0) {
        int result  = (value >> offset) & 1;
        printf("%i", result);
        // 3.每次取出一位就让控制右移的变量-1
        offset--;
        if ((offset+1) % 4 == 0) {
            printf(" ");
        }
    }
    printf("\n");
}
  • 数组名作为函数的参数传递, 传递的是数组的地址
  • 指针在64位编译环境占8个字节
  • 如果数组作为形参, 那么在函数中就不能通过数组的名称计算出数组元素的个数因为系统会自动将数组形参转换为指针, 指针占用8个字节。如果数组作为参数传递给函数内容时,如果内部想要获取数组长度,只能在函数外部,将数组长度计算出来,然后作为参数传递到函数内部

  • 桶排序和二分查找

桶排序会有一个数组,以输入数据为下标,元素内容为每个输入数据的次数。数组初始化大小是输入参数中最大数的大小-1,所以不适合用来排序参数较大的输入,会占用很多空间。如果数据不大,使用倒是很方便的。

二分查找主要体现一种分治的思想。查找前要求数组排好序。也就是,先排序,再查找。

&取地址符

%p输出地址

*可用于取指针变量的内容

  • 通过指针取数组元素
int ages[3] = {1, 3 , 5};
    int *p;
    p = ages;
    
    for (int i = 0; i < 3; i++) {
        // 指针+1, 是加上指针类型所占用的长度
        printf("ages[%i] = %i\n", i, *(p + i));
    }

只要一个指针指向了数组, 那么访问数组就有3种方式:
     1. : ages[0];//通过数组变量和索引访问
     2. : p[0];//通过指针变量和索引访问
     3. : *(p + 0);//通过指针变量计算访问数组元素

  • 通过数组保存字符串和通过指针保存字符串的区别

一个保存在栈中,一个在常量区;一个可以修改,一个不能修改

  • 求字符串算法
char *name = "lnj";
//    size_t size = strlen(name);
    int size =myStrlen3(name);
    printf("size = %i\n", size);
 
int myStrlen3(char *str)
{
    int count = 0;
    // \0 ascii 0 // 0代表假 1真
    while (*str++)count++;
    
    return count;
}

最大的启发是做回调函数

  • 结构体是用于保存一组不同类型的数据
  • 结构体的定义和初始化
    struct Person
    {
        int age;
        char *name;
        double height;
    } sp;
  • 结构体分配存储空间,获取结构体类型中占用内存最大的属性的大小, 然后取该大小的倍数。
  • 执行结构体的指针
    (*sip).name = "xxx";
  • 结构体数组
  • 结构体嵌套
  • C语言中的枚举
  • static关键字,修饰变量和方法的时候,会把作用域限定在文件内
  • 带参数的宏,条件编译
#ifdef SCORE // 判断是否定义了后面的宏
    printf("score\n");
#elif COUNT
    printf("count\n");
#else
    printf("OTHER\n");
#endif
  • 预处理指令在编译前执行
  • 宏定义的作用:   会在程序翻译成0和1之前, 将所有宏名替换为 宏的值
  • typedef可以给任何数据类型重命名
  • const修饰的变量内容不可改变,变量变为常量。
  • const修饰的指针变量,指针变量指向的地址的内容可以改变,但是指针保存的地址不能变。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值