ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

# C语言学习

2022-03-08 12:02:20  阅读:134  来源: 互联网

标签:name pointer C语言 学习 类型 var type 变量


目录

数据类型

  • 基本类型

    • 整数类型

      类型 存储大小(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;
}

标签:name,pointer,C语言,学习,类型,var,type,变量
来源: https://www.cnblogs.com/travonD/p/15979835.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有