(嵌入式八股)No.1 C语言(2)

2.1 进制基础

常用进制表示

无论是使用哪种语言,使用哪种“进制”,描述的都是同一个“数值”。

int decimal = 100;      // 十进制
int binary = 0b1100100; // 二进制(C99标准支持,前缀0b)
int octal = 0144;       // 八进制(前缀0)
int hex = 0x64;         // 十六进制(前缀0x)


#include <stdio.h>

int main() {
    int num = 100;
    
    printf("十进制: %d\n", num);    // 100
    printf("八进制: %o\n", num);    // 144
    printf("十六进制: %x\n", num);   // 64(小写)
    printf("十六进制: %X\n", num);   // 64(大写)
    printf("带前缀十六进制: %#x\n", num); // 0x64
    
    return 0;
}

进制之间的转换

16进制里,每一位的权重,从右往左数,分别是:16^0, 16^1, 16^2, 16^3, 16^4, ……。

8进制里,每一位的权重,从右往左数,分别是:8^0, 8^1, 8^2, 8^3, 8^4, ……。

2进制里,每一位的权重,从右往左数,分别是:2^0, 2^1, 2^2, 2^3, 2^4, ……。

各进制对照表

2.2 命名规则与语法

标识符命名规则

  • 允许字符:字母(A-Z, a-z)、数字(0-9)、下划线(_)
  • 开头字符:必须是字母或下划线(不能是数字)
  • 大小写敏感:count 与 Count 是不同的变量
  • 长度限制:C89标准至少31个字符有效,C99至少63个字符
  • 关键字不能作为标识符(如int, if, for等)

命名规范示例

// 良好命名示例
int student_count;      // 小写+下划线(snake_case)
float averageScore;     // 驼峰命名法
#define MAX_SIZE 100    // 宏定义全大写
const float PI = 3.14;  // 常量可首字母大写

// 非法命名示例
int 2nd_value;     // ❌ 以数字开头
float total-score; // ❌ 包含减号
char int;          // ❌ 使用关键字

常见命名约定

// 变量:描述性名词
int age, counter, buffer_size;

// 函数:动词开头
void calculate_total();
int get_max_value();

// 指针:p开头或ptr结尾
int *p_data;
int *data_ptr;

// 布尔类型:is/has/can开头
int is_valid;
int has_finished;

操作符优先级

2.3 库函数(如果你的技术栈是 c 语言的话,面试官可能会考察一些库函数的底层实现)

sizeof 和 strlen(这个在笔试里面会考)

sizeofstrlen 是两个非常常用的运算符和函数,它们在功能和用途上有明显的区别。

区别

示例

//普通变量
int a = 10;
printf("%zu\n", sizeof(a));   // 输出:4(假设 int 为4字节)
// strlen(a); ❌ 错误:a不是字符串

//字符串常量 vs 字符数组
char str1[] = "Hello";
char *str2 = "Hello";

printf("%zu\n", sizeof(str1)); // 6 (包括 '\0')
printf("%zu\n", sizeof(str2)); // 8 (指针本身的大小,在64位系统上)
printf("%zu\n", strlen(str1)); // 5 (不含 '\0')
printf("%zu\n", strlen(str2)); // 5
解释:
sizeof(str1):数组占 6 个字节('H','e','l','l','o','\0')
sizeof(str2):只返回指针大小(通常 8 字节)
strlen(str1) / strlen(str2):计算字符串内容长度(直到 \0)

//字符串中途有 \0
char msg[] = "Hi\0NEU";

printf("%zu\n", sizeof(msg)); // 7 (包含整个数组长度)
printf("%zu\n", strlen(msg)); // 2 (到第一个 '\0' 为止)

strlen() 会在遇到第一个 \0 时停止计数,而 sizeof 不会。

总结

  • sizeof: 用于获取变量或数据类型的大小(以字节为单位)。在编译时计算,不会增加运行时的开销。适用于数组、结构体、变量等。
  • strlen: 用于计算字符串的长度(以字符为单位)。在运行时计算,会逐个字符检查字符串,直到遇到终止符 \0。适用于字符串操作,但需要注意字符串的初始化和合法性。

malloc 和 calloc(这个也会考)

malloccalloc 是两个用于动态内存分配的标准库函数。它们都属于 <stdlib.h> 头文件,用于在运行时分配内存。

二者对比

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    int *p1 = (int *)malloc(5 * sizeof(int));
    int *p2 = (int *)calloc(5, sizeof(int));

    for (int i = 0; i < 5; i++)
        printf("malloc[%d] = %d, calloc[%d] = %d\n", i, p1[i], i, p2[i]);

    free(p1);
    free(p2);
    return 0;
}
输出:
malloc[0] = -858993460, calloc[0] = 0
说明 malloc 分配的内存未初始化,而 callo

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

泻湖花园嵌入式Offer指南 文章被收录于专栏

从入门到上岸,一站式搞定求职! 本硕纯机械,无竞赛无论文,后转行嵌入式软件开发(因为课题组师哥转嵌入式拿到30Woffer之后狠狠心动),秋招最终收获35W+offer可以为27届或者28届的的UU们提供参考,可以关注一下!!!

全部评论
大家可以关注一下,近期会陆续更新
1 回复 分享
发布于 03-01 16:23 山东

相关推荐

评论
4
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务