C语言语法笔记

数据类型

  • 基本类型

    • 整数类型

      类型 存储大小(bytes)
      char 1
      unsigned char 1
      signed char 1
      int 2 or 4
      unsigned int 2 or 4
      short 2
      unsigned short 2
      long 4
      unsigned long 4
    • 浮点类型

      类型 存储大小(bytes) 精度(有效位数)
      float 4 6
      double 8 15
      long double 16 19
  • 枚举类型

  • void类型: 指变量占用的内存大小为零, void *pointer_name只指明地址, 而不声明内存大小(不知道对象大小).

  • 派生类型

    • 指针类型
    • 数组类型
    • 结构体类型
    • 共用体类型
    • 位域类型
    • 函数类型

变量

声明: 向编译器保证变量会以指定的名称和类型存在, 令编译器能够在不知道具体细节时也能够进一步编译.

定义: 为声明的变量建立存储空间(预留内存, 方便存放待输入的变量).

除非使用extern关键字, 否则在声明时都将直接完成变量的定义.

声明变量时, 通过如下结构:

// 声明&定义 type var_name; type var_name1, ..., var_nameN; // 赋值 type var_name = var_value; // 使用extern关键字, 只声明, 不定义. extern type var_name

其中, type主要功能为声明变量类型, 就是为变量分配内存空间, 通过指定具体的类型, 编译器可以得知需预留的内存大小.

变量的变化范围超出指定的内存空间后, 会出现内存溢出, 可能返回预期之外的结果.

声明指针变量时, 稍有不同:

// 声明&定义 type *pointer_name; // 指向指针的指针, 可继续外推 type **pointer_name; // 赋值 type *pointer_name = mem_addr;

其中, 星号*即表示该变量为一个指针变量(告诉编译器这只是个地址), type表示该变量指向对象的类型(告诉编译器在到达地址后, 往后多大范围内是要找的对象).

存储类

存储类定义了程序中变量的可见性和生命周期, C语言中可用的存储类有:

  • auto: 所有局部变量默认的存储类
  • register: 存储在寄存器(而非RAM)中的局部变量, 没有内存地址, 最大尺寸等于寄存器的大小(通常为一个字).
  • static:
    • 修饰局部变量时, 可以在程序生命周期内持续保持变量, 而不用每次进入/离开作用域时就创建/销毁.
    • 修饰全局变量时, 会使变量的作用域限制在声明它的文件内.
  • extern: 提供对全局变量的引用, 用以告知编译器该变量将在其他文件内完成定义.

函数

定义方法:

reture_type func_name(params_list) { function_body; }

函数指针的定义方法:

return_type (*func_pointer)(param1_type, ..., paramN_type); // 赋值 return_type (*pointer_name)(param1_type, ..., paramN_type) = & some_func;

枚举

批量完成名称到整数的映射, 若不显式赋值, 则首位元素默认为0, 非首位元素为前一元素+1.

若元素对应的整数不连续, 则该枚举无法遍历.

定义方法:

enum tag { element_name1 = some_int; ... element_name2 = some_int; } var_name;

结构体

一种用于存储多个不同类型数据的结构, 占用内存大小为所有成员之和.

定义方法:

struct tag { type member1; ... type memberN; } var_name; // 声明&定义 struct tag var_name; // 赋值 struct tag var_name = {member1, ..., memberN}; // 对成员赋值 var_name.memberX = member_value;

共用体

指定一块可以存储多种类型数据的内存空间, 空间大小由占用内存最大的成员决定.

同一时间只能使用一个成员(存储某一成员时, 会由于共用内存而影响其他成员)

定义方法:

union tag { type member1; ... type memberN; } var_name; // 声明&定义 union tag var_name; // 赋值 var_name.memberX = member_value;

位域

指定成员将使用的位数(需不大于其依附的类型)从而节约内存占用. 原内存空间不足存放新成员时, 会另起一块新的内存空间(大小取决于新成员依附类型)开始存放.

定义方法:

struct tag { type member1 : bits; ... type memberN : bits; } var_name;

typedef关键字

用于定义数据类型的别名, 也可以通过该方法简化结构体数据的声明.

定义方法:

typedef struct tag { type member1; ... type memberN; } struct_name; // 声明&定义 struct tag var_name; struct_name var_name;

const关键字

用于指明某变量不可重新赋值, 令其成为常量. 若尝试对const修饰的变量赋值则会引发错误(故通常需要在声明时就完成赋值), 观察const本身的行为, 类似对变量"写保护".

对于定义的常量, 编码规范要求其名称首字母应大写, 以提醒程序员"此为常量".

使用方法:

// 对常规变量使用 type const var_name = var_value; // 对指针使用: // 保护指针指向的变量(住在该地址的住户)不变, 但指针(地址)本身可变 type const *pointer_name = var_value; // 保护指针(地址)不变, 但指向的变量(地址的住户)可变 type * const pointer_name = var_value; // 同时保护指针及其指向的变量不变 type const * const pointer_name = var_value;

更常用的使用场景并非直接定义常量, 而是用于修饰函数的形参, 避免函数对传入的参数做不期望的改动:

return_type func_name(type const *pointer_param) { function body; }

__EOF__

本文作者travonD
本文链接https://www.cnblogs.com/travonD/p/c_programming_language.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   travonD  阅读(79)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示