C语言程序设计细节解析及数据类型

C语言程序设计细节解析 + 数据类型全家福
(2026 年视角 · 面试 + 嵌入式 + 竞赛三栖通用版,细节拉满,小白也能看懂)

一、C语言程序的基本结构(必须死记的模板)

#include <stdio.h>          // 预处理指令(头文件)
#include <stdlib.h>

// 宏定义(可选)
#define PI 3.14159
#define MAX(a,b) ((a)>(b)?(a):(b))

// 全局变量(尽量少用)
int global_count = 0;

// 函数原型声明(可选,但推荐)
void say_hello(void);

// main 是程序入口(必须有且只有一个)
int main(void)               // 推荐写法:明确 void
{
    // 局部变量声明必须在代码最前面(C89标准)
    // C99 以后可以混写
    int a = 10;
    char c = 'A';

    printf("Hello C 2026!\n");

    say_hello();

    return 0;                // 0 表示成功,非0表示异常
}

// 自定义函数定义
void say_hello(void)
{
    printf("你好,C语言!\n");
}

二、C语言所有数据类型完整表格(带内存大小 + 取值范围 + printf格式)

类型类别类型名称字节数(32/64位通用)取值范围printf 格式化scanf 格式化备注
整数类型char1-128 ~ 127(有符号)或 0~255(无符号)%c%c字符型,本质是小整数
unsigned char10 ~ 255%c / %hhu%hhu
signed char1-128 ~ 127%hhd%hhd很少用
short int2-32768 ~ 32767%hd%hd
unsigned short20 ~ 65535%hu%hu
int4-2^31 ~ 2^31-1%d%d最常用整数
unsigned int40 ~ 4e9+%u%u
long4 或 8(Windows 4,Linux 64位是8)取决于系统%ld%ld注意平台差异
unsigned long4 或 8%lu%lu
long long8-2^63 ~ 2^63-1%lld%lldC99 引入,必背
unsigned long long80 ~ 2^64-1%llu%llu
浮点类型float4±3.4E38(7位有效数字)%f%f默认输出6位小数
double8±1.7E308(15位有效数字)%lf%lfprintf 用 %lf,scanf 必须 %lf
long double12 或 16更大精度%Lf%Lf嵌入式基本不用
布尔类型_Bool(C99)10 或 1%d%d需要 #include 才能用 bool
bool()1false / true
指针类型任意类型*4 或 8(32/64位)内存地址%p%p打印要加 void* 转换
void 类型void无大小无值用于函数无返回、无参数

终极记忆口诀
char short int long long double → 1 2 4 4/8 8 8

三、关键细节解析(面试 + 实际开发必考)

细节点正确写法 / 常见错误解释 / 建议
main 函数写法int main(void)int main(int argc, char *argv[])明确写 void 最规范
printf 打印 long long%lld(Linux) vs %I64d(旧 Windows)推荐统一用 %PRId64(需 #include )
打印指针printf("%p\n", (void*)ptr);必须强制转 void*
常量定义const int MAX = 100;#define MAX 100const 有类型检查,更安全
字符与整数'A' + 1 == 66‘A’ 的 ASCII 是 65
char 有符号还是无符号?取决于编译器!(gcc 默认 signed)跨平台建议显式写 signed char / unsigned char
float 精度陷阱0.1 + 0.2 != 0.3浮点数是近似值,钱用整数分表示
sizeof 和 strlen 区别sizeof 包含 ‘\0’,strlen 不包含char str[100] → sizeof=100,strlen 取决于内容
数组名就是指针?大部分情况下是,但不是完全等价数组名在表达式中会退化为指针,但 sizeof(数组) 是总大小

四、实战代码示例(建议直接敲)

#include <stdio.h>
#include <stdint.h>     // 推荐!固定宽度整数
#include <inttypes.h>   // PRId64 等宏
#include <stdbool.h>

int main(void)
{
    // 固定宽度类型(嵌入式/跨平台必备)
    int8_t   a = -128;
    uint8_t  b = 255;
    int64_t  big = 9223372036854775807LL;   // 注意加 LL

    printf("int64_t 最大值: %" PRId64 "\n", big);
    printf("指针地址: %p\n", (void*)&a);

    // 浮点数精度演示
    float  f = 0.1f;
    double d = 0.1;
    if (f + f + f == 0.3f) {
        printf("相等\n");       // 不会打印!
    } else {
        printf("不相等!浮点数有精度误差\n");
    }

    return 0;
}

五、总结速记表(贴在显示器旁边)

你想存什么?推荐类型理由
单个字符char最省空间
布尔值bool(#include )可读性好
计数器/循环变量int 或 unsigned int够用
大整数(>20亿)long long / int64_t安全
钱(精确小数)int(存分)避免浮点误差
高精度计算double比 float 精度高一倍
跨平台固定宽度int32_t、uint64_t 等#include
地址/指针void* 或 uintptr_t通用

掌握上面这些,你写 C 程序就不会再踩数据类型和格式化输出这些低级坑了!

你现在最想深入的是哪一块?

  • 指针和地址的细节?
  • 结构体、共用体、位段?
  • 预处理、宏、条件编译?
  • 还是嵌入式常见的 volatile、const、restrict?

告诉我,我接着给你出下一份超详细笔记~

文章已创建 4237

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部