编程中char字段的大小范围是多少?

目录 C 语言语法 一、 基础 1、 第一个程序 2、 程序编译步骤 3、 汇编语言 二、 数据类型 1、 常量与变量 2、 整型 2.1 格式化输出 2.2 定义 3、 字符型 3.1 定义 3.2 输入 4、 浮点型 5、 类

        • 1.3 函数的调用:获得随机数
        • 1.2 物理存储器和存储地址空间
        • 1.4 指针和指针变量
        • 2.1 指针变量的定义和使用
        • 2.2 指针变量间接修改变量的值
        • 2.4 野指针和空指针
        • 5.2 数组名做函数参数
        • 6.1 字符串出现的次数
        • 1.4 全局函数和静态函数
        • 2.2 堆空间开辟和释放

C 语言语法 一、 基础 1、 第一个程序

// 导入一个文件,std是一个标准库,io是输入输出
"" 表示导入自定义的文件

system:使用系统命令是,成功返回0

C 代码编译成可执行程序经过4步:

(1)预处理:宏定义展开、头文件展开、条件编译等,同时将代码中的注释删除,这里并不会检查语法

(2)编译:检查语法,将预处理后文件编译生成汇编文件

(3)汇编:将汇编文件生成目标文件(二进制文件)

(4)链接:C语言写的程序是需要依赖各种库的,所以编译之后还需要把库链接到最终的可执行程序中去

使用gcc查看编译过程

-o:表示输出文件的地址

二、 数据类型 1、 常量与变量

  • 关键字:C语言里面有32个关键字

    • 在程序运行过程中,其值不能被改变的量
    • 常量一般出现在表达式或赋值语句中
    • 在程序运行过程中,其值可以发生改变的量
    • 变量在使用时必须先定义,定义变量前必须有相应的数据类型
  • 标识符只能由字母、数字、下划线组成
  • 第一个字符必须为字母或下划线
  • 标识符中字符区分大小写
  • 变量在编译时为其分配相应的内存空间
  • 可以通过其名字和地址访问相应的内存

2、 整型 2.1 格式化输出

%d输出一个有符号的十进制整型数据 %o输出八进制的整型数据 %x输出十六进制的整型数据,字母以小写输出 %X输出十六进制的整型数据,字母以大写输出 %u输出一个十进制的无符号数

C 不能直接书写二进制数据的形式

使用scanf会出现安全问题,使用scanf_s,安全输入

使用不同的关键字定义整型,其开辟的空间是不一样的,所占字节数与所选择的操作系统有关,可以使用sizeof(int)来查看所占空间(BYTE

字符型变量用于存储一个单一字符,在C 语言中用char表示,其中每个字符变量都会占用1个字节。在给字符型变量赋值时,需要使用单引号

字符型变量实际上并不是把该字符本身放到变量的内存单元中去,而是将该字符对应的acsii编码放到变量的存储单元中。char的本质就是一个1字节大小的整型

浮点型变量也可以称为实型变量,浮点型变量是用来存储小数值的。在 C 语言中,浮点型变量分为两种:单精度浮点数(float)、双精度浮点数(double),但是double型变量所表示的浮点数比float型变量更准确

由于浮点型变量是由有限的存储单元组成的,因此只能提供有限的有效数字。在有效位以外的数字将被舍去,这样可能会产生一些误差。

不以f结尾的常量是double类型,以f结尾的常量(如:3.14f)是float类型

extern声明一个变量,extern声明的变量没有建立存储空间 const定义一个常量,常量的值不能修改 Volatile防止编译器优化代码 register定义寄存器变量,提高效率

6、 字符串 6.1 字符串常量

  • 字符串是内存中一段连续的char空间,以'\0'结尾
  • 字符串常量是有双引号括起来的字符序列

字符串常量和字符常量不同

  • 每个字符串的结尾,编译器会自动添加一个结束标志位'\0'

printf是输出一个字符串,putchar输出一个字符

%a,%A 浮点数、十六进制数字和p-计数法 %c 一个字符 %C 一个ISO宽字符 %d 有符号十进制整数(int)(%ld ,%Ld为:长整型数据,%hd:短整型数) %e,%E 浮点数,e-计数法,E-计数法 %f 单精度浮点数 %g,%G 根据数值不同自动选择%f或%e %i 有符号十进制数(与%d相同) %o 无符号八进制整数 %p 指针 %s 对应字符串char*(%s - 左对齐 + 右对齐 .n 对于小数点,保留n位小数 # 对c,s,d,u无影响,对o类输出前加缀为o,对x类,在输出前缀加0x,对e,g,f当结果有小数时给出小数点 m 代表数据的最小宽度

输出字符可以是变量、字符、数字或者转义字符

getchar是从标准输入设备读取一个字符;scanf_s通过%转义的方式可以得到用户通过标准输入设备输入的数据

ch = getchar(); // 只会接收一个字符,如果有其他的,可以使用while循环遍历,也可以用来作为暂时停留界面

数据有不同的类型,不同类型数据之间进行混合运算时必然涉及到类型的转换问题

自动转换:遵循一定的规则,由编译系统自动完成

小范围的类型会自动转换成大范围的类型运算

把表达式的运算结果强制转换成所需的数据类型

数据类型2 变量2 = (数据类型2)变量1 // 其不会四舍五入,直接丢失后面的数据

三、 运算符 1、 算术运算符

+:加 -:减 *:乘 /:除 %:取余 ++:自增 --:自减
// 前自增先赋值,后运算;后自增相反

用于将表达式的值赋给变量

用于表达式的比较,并返回一个真值(true)或假值(false)

用于根据表达式的值返回真值或假值

所有非零的值都是真值,非真即假

C/C++支持最基本的三种程序运行结构:顺序结构、选择结构、循环结构

  • 顺序结构:程序按顺序执行,不发生跳转
  • 选择结构:依据条件是否满足,有选择的执行相应功能
  • 循环结构:依据条件是否满足,循环多次执行某段代码

作用:执行满足条件的语句

// 选择结构 单行if语句 // 用户输入一个数字 // 判断数字是否大于100,是则输出原数 // 选择结构 单行if语句 // 用户输入一个数字 // 判断数字是否大于100,是则输出原数;否则,输出0 // 选择结构 单行if语句 // 用户输入一个数字 // 判断数字是否大于100,是则输出原数;否则,输出0

在if语句中,可以嵌套使用if语句,达到更加精确的条件判断

案例:输入3个数字,判断出最大的数字

作用:通过三目运算实现简单的判断

语法:表达式1 ? 表达式2 : 表达式3

// 将 a 和 b 做比较,将大的值赋值给c

在C++中,三目运算符返回的是变量,可以继续赋值

作用:执行多条件分支语句

break; // 退出当前分支,如果没有break,则会继续向下运行 default: // 当所有条件不满足时,执行该语句

缺点:判断的时候,只能是整型或者字符型,不可以是一个区间

优点:结构清晰,执行效率高

  • switch语句中表达式类型只能是整型或者字符型
  • case里如果没有break,那么程序会一直向下执行

作用:满足循环条件,执行循环语句

解释:只要循环条件的结果为真,就执行循环语句

// 在屏幕中打印0到9的数字

作用:满足循环条件,执行循环语句

注意:与while的区别在于do...while会先执行一次循环时间,在判断循环条件

作用:满足循环条件,执行循环语句

语法:for (起始表达式;条件表达式;末尾循环体) { 循环语句; }

// 从数字0打印到9

作用:在循环中在嵌套一层循环,解决一些实际问题

作用:用于跳出选择结构或者循环结构

break使用的时机:

  • 出现在循环语句中,作用是跳出当前的循环语句
  • 出现在嵌套循环中,跳出最近的内层循环语句

作用:在循环语句中,跳过本次循环中余下尚未执行的语句,继续执行下一次循环

作用:可以无条件跳转语句

解释:如果标记的名称存在,执行到goto语句时,会跳转到标记的位置

五、 数组和字符串 1、 概述

在程序设计中,为了方便处理数据把具有相同类型的若干变量按有序形式组织起来——称为数组

数组就是在内存中连续的相同类型的变量空间。同一个数组所有的成员都是相同的数据类型,同时所有的成员在内存中的地址是连续的

整型数组默认初始化的值为0,

作用:最常用的排序算法,对数组内的元素进行排序

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个
  2. 对每一对相邻元素做同样的工作,执行完毕后,找到第一个最大值
  3. 重复以上的步骤,每次比较次数-1,直到不需要比较
// 利用冒泡排序,实现升序排序

二维数组定义的一般形式是:

类型说明符 数组名[常量表达式1][常量表达式2];

其中常量表达式1表示行数,常量表达式2表示列数

如果字符数组有'\0'的标志,则可以认为其是一个字符串,字符串是字符数组的特例

字符数组和字符串的区别:

  • C 语言中没有字符串这种数据类型,可以通过char的数组来替代
  • 字符串一定是一个char的数组,但char的数组未必是字符串
  • 数字0(和字符'\0'等价)结尾的char数组就是一个字符串,但如果char数组没有以数字0结尾,那么就不是一个字符串,只是普通字符数组,所以字符串是一种特殊的char数组
// 功能:从标准输入读取字符,并保存到指定的内存空间,直到出现换行或读到文件结尾为止,成功返回字符串,失败返回空 // 功能:从stream指定的文件中读入字符,保存到所指定的内存空间,直到出现换行字符、读到文件结尾或是已读了size-1个字符为止,最后会自动加上'\0',作为字符串结束,成功返回字符串,失败返回空。其通过键盘输入时,包括了最后的'\n'换行
  • scanf_s不允许输入有空格;gets_s允许输入有空格

例如,获取键盘输入的字符串:

上面的代码都是获取从键盘输入的字符串

// 功能:标准设备输出字符串,在输出完成后自动输出一个'\n' // 功能:将s所指定的字符串写入到stream指定的文件中,字符串结束符'\0'不写入文件,同时不会自动换行 // 功能:计算指定字符串的长度,不包括'\0'

六、 函数 1、 概述 1.1 函数的分类

C 程序是由函数构成的,我们写的代码都是由主函数 main() 开始执行的。函数是 C 程序的基本模块,是用于完成特定任务的程序代码单元。

从函数定义的角度看,函数可分为系统函数和用户定义函数两种:

  • 系统函数,即库函数:这是编译系统提供的,用户不必自己定义这些函数,可以直接使用它们
  • 用户定义的函数:用以解决用户的专门需要

从函数执行结果的角度来看, 函数可分为有返回值函数和无返回值函数两种

  • 有返回值函数:此类函数被调用执行完后将向调用者返回一个执行结果,称为函数返回值。(必须指定返回值类型和使用return关键字返回对应数据)
  • 无返回值函数:此类函数用于完成某项特定的处理任务,执行完成后不向调用者返回函数值。(返回值类型为void, 不用使用return关键字返回对应数据)

从主调函数和被调函数之间数据传送的角度看,又可分为无参函数和有参函数两种

  • 无参函数:在函数定义及函数说明及函数调用中均不带参数。主调函数和被调函数之间不进行参数传送
  • 有参函数:在函数定义及函数说明时都有参数,称为形式参数(简称为形参)。在函数调用时也必须给出参数,称为实际参数(简称为实参)
  1. 函数的使用可以省去重复代码的编写,降低代码重复率
  2. 函数可以让程序更加模块化,从而有利于程序的阅读,修改和完善

1.3 函数的调用:获得随机数

当调用函数时,需要关心5要素:

  • 头文件:包含指定的头文件
  • 函数名字:函数名字必须和头文件声明的名字一样
  • 功能:需要知道此函数能干嘛后才调用
  • 返回值:根据需要接收返回值

2、 函数定义和使用 2.1 函数的定义

    • 将一个常用的功能封装起来,方便以后调用
  • 返回值类型 函数名(参数类型 形参1, 参数类型 形参2, ...) {
    

    在函数调用过程中传递的参数称为实参,有具体的值

    在函数的定义中参数称为形参,形式参数

    在函数调用过程中实参传递给形参

    在函数调用结束后,函数会在内存中销毁

理论上,函数名是可以随意起名字,见名知义,应该让用户看到这个函数名字就知道这个函数的功能。注意,函数名的后面要加括号,代表这个是函数,而不是普通的变量

在定义函数时,指定形参,在未出现函数调用时,它们并不占内存中的存储单元。因此,称它们是形式参数或虚拟参数,简称形参,表示它们并不是实际存在的数据,所以,形参里的变量不能赋值

在定义函数时指定的形参,必须是类型+变量的形式

花括号里面的内容即为函数体的内容,这里为函数功能实现的过程,这和以前的写代码没太大区别,以前我们把代码写在main()函数里,现在只是把这个写到别的函数里面

函数的返回值是通过函数中的return语句获得的,return后面的值也可以是一个表达式

  1. 尽量保证return语句中表达式的值和函数返回类型是同一类型
  2. 如果函数返回的类型和return语句中表达式的值不一致,则以函数返回类型为准,即函数返回类型决定返回值类型。对数值型数据,可以自动进行类型转换。

定义函数后,我们需要调用此函数才能执行到这个函数里面的代码段。这和main()函数不一样,main()为编译器设定好自动调用的主函数,无需人为调用,我们都是在main()函数里调用别的函数,一个C程序里有且只有一个main()函数

    • 它会在main()函数的前面寻找有没有一个名字叫做test的函数定义
    • 如果找到,接着检查函数的参数,这里调用函数是没有传参,函数定义也没有形参,参数类型匹配
    • 开始执行test()函数,这时候,main()函数李曼的执行会阻停在test()这一行代码,等待函数执行完成
  1. 函数执行完成后,main()函数继续执行
  • 形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用
  • 实参出现在主调用函数中,进入被调函数后,实参也不能使用
  • 实参变量对形参变量的数据传递是"值传递",即单向传递,只由实参传给形参,而不能由形参传回来给实参
  • 在调用函数时,编译系统临时给形参分配存储单元。调用结束后,形参单元被释放
  • 实参单元与形参单元是不同的单元。调用结束后,形参单元被释放,函数调用结束返回主函数后则不能再使用该形参变量。实参单元仍保留并维持原值。因此,在执行一个被调用函数时,形参的值如果发生改变,并不会改变主调函数中实参的值

从广义的角度来讲,声明中包含着定义,即定义是声明的一个特例,所以并非所有的声明都是定义:

  • int b它既是声明,同时又是定义
  • 对于extern b来讲,它只是声明,不是定义

一般的情况下,把建立存储空间的声明称之为“定义”,而把不需要建立存储空间的声明称之为“声明”

一个文件实现函数hello.c

一个文件调用函数main.c

  • main是函数的名称,和我们自定义的函数名称一样,也是一个标识符
  • 只不过main这个名称比较特殊,程序一启动就会自动调用它
  • 告诉系统main函数是否正确的被执行了
  • 如果main函数的执行正常,那么就返回0
  • 如果main函数的执行不正常,那么就返回一个非0的函数
  • 一个函数return 后面写的是什么类型,函数的返回值类型就必须是什么类型,所以写int
    • 系统在启动程序是调用main函数时传递给argv的值的个数
    • 系统在启动程序时传入的值,默认情况下系统会传入一个值,这个值就是main函数执行文件的路径
    • 也可以通过命令行或项目设置传入其它参数
  • 一个函数在它的函数体内调用它自身称为递归调用
  • 存在一个条件能够让递归结束

实例:求一个数的累加和

  • 能用循环实现的功能,用递归都可以实现
  • 递归常用于"回溯", “树的遍历”,"图的搜索"等问题
  • 但代码理解难度大,内存消耗大(易导致栈溢出), 所以考虑到代码理解难度和内存消耗问题, 在企业开发中一般能用循环都不会使用递归
  • 存储器:计算机的组成,用来存储程序和数据,辅助CPU进行运算处理的重要部分
  • 内存:内部存储器,暂存程序/数据——掉电丢失
  • 外存:外部存储器,长时间保存程序/数据——掉电不丢失

内存是沟通CPU与硬盘的桥梁:

  • 暂存放CPU中的运算数据
  • 暂存与硬盘等外部存储器交换的数据

1.2 物理存储器和存储地址空间

有关内存的两个概念:物理存储器和存储地址空间

物理存储器:实际存在的具体存储芯片

  • 显示卡上的显示RAM芯片
  • 各种适配卡上的RAM芯片和ROM芯片

存储地址空间:对存储器编码的范围。我们在软件上常说的内存是指这一层含义

  • 编码:对每个物理存储单元分配一个号码
  • 寻址:可以根据分配的号码找到相应的存储单元,完成数据的读写
  • 将内层抽象成一个很大的一维字符数组
  • 编码就是对内存的每一个字节分配成一个32位或64位的编号
  • 这个内存编号我们称之为内存地址

内存中的每一个数据都会分配相应的地址:

  • char:占一个字节分配一个地址
  • int:占四个字节分配四个地址

1.4 指针和指针变量

C 语言中把地址形象地称作指针

可以保存地址值(指针)的变量称为指针变量,因为指针变量中保存的是地址值,故可以把指针变量形象地比喻成地址箱

2、 指针基础知识 2.1 指针变量的定义和使用

  • 指针也是一种数据类型,指针变量也是一种变量
  • 指针变量指向谁,就把谁的地址赋值给指针变量
// 定义一个指针变量

2.2 指针变量间接修改变量的值

使用取值运算符来修改指针变量所对应的值

  • 使用sizeof()测量指针的大小,得到的总是:4或8
  • sizeof()测的是指针变量指向内存地址的大小
  • 在32位平台,所有指针地址都是32位(4bit)
  • 在64位平台,所有指针地址都是64位(8bit)

2.4 野指针和空指针

指针变量也是变量,是变量就可以任意赋值,不要越界即可,但是任何数值赋值给指针变量没有意义,因为这样的指针就成了野指针,此指针指向的区域是未知的(操作系统不允许此指针指向内存区域)。所以,也指针不会直接引发错误,操作指针指向的内存区域才会出问题。

// 操作系统将0~255作为系统占用空间,不允许访问操作 // 操作野指针对应的空间可能报错

但是,野指针和有效指针变量保存的都是数值,为了标志此指针变量没有指向任何变量。C语言中,可以把NULL赋值给此指针,这样就标志此指针为空指针,没有任何指针。

void*指针可以指向任意变量的内存空间:

// 万能指针可以接收任意类型变量的内存地址 // 在通过万能指针修改变量的值时,需要找到变量对应的指针类型 // 修饰 *,指针指向内存区域不能修改,指针指向可以改变 // 修饰 p2,指针指向不能改变,指针指向的内存可以修改

3、 指针和数组 3.1 数组指针

数组名字是数组的首元素地址,但它是一个常量

// arr = 10; // 其报错,因为a相当于一个指针常量,其指向不能改变 // 数组名是数组第一个元素的首地址

数组作为函数参数会退化为指针,丢失了数组的精度

指针操作数组时,下标允许是负数

  • 指针计算不是简单的整数相加
  • 如果是一个int*,+1的结果是增加一个int的大小
  • 如果是一个char*,+1的结果是增加一个char的大小

两个指针进行运算会变成野指针,其为没有意义的操作(两数组指针相减,其为偏移量);但是可以进行比较运算

指针数组,它是数组,数组的每个元素都是指针类型

指针数组里面也可以存储数组,指针数组是一个特殊的二维数组模型

// 访问指针数组里面的内容

二级指针相当于指针数组

二级指针加偏移量相当于跳过了一维数组的大小

// 二级指针加偏移量,相当于跳过了一个一维数组 // 一级指针加偏移量,相当于跳过了一个元素

5、 指针和函数 5.1 地址传递

5.2 数组名做函数参数

数组名做函数参数,函数的形参会退化成指针

如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针。

函数指针不可以进行运算

// 也可以将函数指针作为参数传递给函数

函数指针一般用于传递回调函数上面

6、 指针和字符串 6.1 字符串出现的次数

使用strstr方法,来统计出现的次数

    • 功能:将源字符串,拷贝给目标字符串
    • 功能:将源字符串的前n个字符拷贝给目标字符串
    • 功能:查看两个字符串是否一样
    • 功能:查看两个字符串的前n个字符是否相同
    • 功能:将src字符串连接到dest的尾部,\0也会追加过去
      • dest:目标字符串的首地址
      • src:源字符串的首地址
    • 功能:将src字符串前n个字符连接到dest的尾部,\0也会追加过去
    • 功能:根据参数format字符串来转换格式化数据,然后将结果输出到str指定的空间中,直到出现字符串结束符\0为止
    • 成功返回实际格式化的字符个数
    • 功能:在字符串s中查找字符c出现的位置
    • 成功返回第一次出现c的地址
    • 功能:在字符串dest中查找字符串src第一次出现的位置
      • dest:原字符串的首地址
      • src:匹配字符串的首地址
    • 成功返回第一次出现字符串的地址
    • 功能:将字符串以字符串delim分割,返回分割第一个字符串,其余字符串放入context中
      • str:要分割的字符串
      • context:一个字符串数组的第一个元素的首地址
    • 成功返回分割后的字符串
    • 功能:atoi()会扫描nptr,跳过前面的空格字符,知道遇到数字或正负号才开始转换,而遇到非数字或字符串结束符,才会结束转换,并将结果返回
      • nptr:待转换的字符串

八、 内存管理 1、 作用域

C语言变量的作用域分别为:

局部变量也叫auto自动变量,auto可不写,一般情况下代码块内部定义的变量都是自动变量,它有如下特点:

  • 在一个函数内定义,只在函数范围内有效
  • 在复合语句中定义,只在复合语句中有效
  • 随着函数调用的结束或复合语句的结束局部变量的声明,声明周期也结束
  • 如果没有赋初值,内容为随机
  • 在函数外定义,可被本文件及其它文件中的函数所共用,若其它文件中的函数调用此变量,须用extern声明,extern int a;这里是声明,而不是定义
  • 全局变量的生命周期和程序运行周期一样
  • 不同文件的全局变量不可重名
  • 生命周期,从程序创建到程序销毁
  • static局部变量的作用域也是在定义的函数内有效
  • static局部变量的生命周期和程序运行周期一样,同时static局部变量的值只初始化一次,但可以多次赋值
  • static局部变量若未赋以初值,则由系统自动赋值,数值型变量自动赋初值0,字符串变量赋空字符
  • 作用域:定义所在的文件中
  • 生命周期:从程序创建到程序销毁
  • 存储位置:存储在数据区

1.4 全局函数和静态函数

在C语言中,函数默认都是全局的,使用关键字static可以将函数声明为静态,函数定义为static就意味着这个函数只能在定义这个函数的文件中使用,在其他文件中不能调用,即使在其他文件中声明这个函数也没法使用

对于不同文件中的static函数名字可以相同

  • 允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰
  • 同一源文件中,允许全局变量和局部变量同名,在局部变量的作用域内,全局变量不起作用
  • 所有的函数默认都是全局的,意味着所有的函数都不能重名,但如果是static函数,那么作用域是文件级的,所以不同的文件static函数名是可以相同的

2、 内存布局 2.1 内存分区

C 代码经过预处理、编译、汇编、链接,4步后生成一个可执行程序

  • 程序执行二进制码(程序指令)
  • 初始化数据区(data)
  • 未初始化数据区(bss)
  • 系统为每一个程序分配一个临时的空间
  • 存储局部变量、函数信息、函数参数、数组
  • 栈区大小为:1M;在Windows中可以扩展到10M;在Linux中可以扩展到16M
  • 存储大数据、图片、音乐、视频

程序在加载到内存前,代码区和全局区的大小就是固定的,程序运行期间不能改变。然后,执行可执行程序,系统把程序加载到内存,除了根据可执行程序的信息分出代码区、数据区和未初始化数据区之外,还额外增加了栈区、堆区

2.2 堆空间开辟和释放

// 开辟堆空间存储数据 // 将指针置空,防止出现野指针
  • 释放指针要释放同一个指针

    p = 123; // 改变了指针的地址,同时指针偏移也会改变指针的地址,其为无主指针
    • 功能:将s的内存区域的前n个字节以参数c填入
      • s:需要操作内存s的首地址
      • n:指定需要设置的大小,单位是字节
    • 功能:拷贝src所指的内存内容的前n个字节到dest所指的内存地址上
      • dest:目标内存首地址
      • src:原内存首地址,注意:首地址不可以重叠
  1. 返回值:dest的首地址

    memmove()功能用法和memcpy()一样,区别在于:当内存空间重叠时,memmove()仍然能处理,不过执行效率更低

    • 功能:比较s1和s2所指向内存区域的前n个字节
      • n:需比较的前n个字节
}

C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 numbers[0]、numbers[1]、...、numbers[99] 来代表一个个单独的变量。数组中的特定元素可以通过索引访问。
所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。

(1)int a[5]; 这是声明了一个数组,数组类型为整型,数组名为a,数组大小为5,表示可以放5个整型元素。

(2)a[5] = {2, 4, 5, 8, 20},这是赋值语句,类比于a = 1。不过通常说成是数组的初始化,而不是给数组赋值。注意,是用大括号把元素包含在内,而不是中括号或小括号。

(3)数组的下标是从0开始的,所以本程序中的五个元素为a[0], a[1], a[2], a[3], a[4],而不是a[1], a[2], a[3], a[4], a[5]。这从for循环也可以看出,for循环是从0增加到4,而不是从1增加到5。如果要获取a[5]或a[6],编译器会报数组越界的错误或者直接取到了0!。

(4)假如数组的大小为size,那么元素的最大下标为size - 1。以本程序为例,大小为5,则最大下标为4,即只能取到a[4]。

(5)如果把在数组声明后直接初始化,类似本程序这样的,可以不用写数组大小,运行效果完全一样。

注意,在声明数组int a[5]的时候,因为不是立即初始化(跟上面的例子不一样),则数组大小(这里为5),不能省略。

在 C 语言中,字符串实际上是使用 null 字符 '

}

(该篇学习内容全部来自于, 本篇内容仅仅是简易学习笔记 , 以自己的理解+网站部分描述结合+个人补充,并不适合编程初学者观看!!! 需要有一定的编程基础)

内存条包含了上亿个电子元器件。这些元器件,实际上就是电路;电路的电压会变化,要么是 0V,要么是 5V,只有这两种电压。5V 是通电,用1来表示,0V 是断电,用0来表示。所以,一个元器件有2种状态,0 或者 1。

一般情况下将8个元器件看做一个单位,即使表示很小的数,例如 1,也需要8个,也就是 。

1个元器件称为1比特(Bit)或1位,8个元器件称为1字节(Byte),那么16个元器件就是2Byte,32个就是4Byte,以此类推:

C语言规定,一个程序必须有且只有一个 main 函数。main 被称为主函数,是程序的入口函数,程序运行时从 main 函数开始,直到 main 函数结束(遇到 return 或者执行到函数末尾时,函数才结束)。

在C语言中使用中文字符

非ASCII 编码字符存储

使用宽字符的编码方式。常见的宽字符编码有 UTF-16 和 UTF-32,它们都是基于 Unicode 字符集的,能够支持全球的语言文化。
C语言推出了一种新的类型,叫做 wchar_t。wchar_t 的长度由编译器决定:

  • 在微软编译器下,它的长度是 2,等价于 unsigned short;

单独的字符由单引号’ ‘包围,例如’B’、’@’、‘9’等;但是,这样的字符只能使用 ASCII 编码,要想使用宽字符的编码方式,就得加上L前缀,例如L’A’、L’9’、L’中’、L’国’、L’。’。

注意,加上L前缀后,所有的字符都将成为宽字符,占用 2 个字节或者 4 个字节的内存,包括 ASCII 中的英文字符。给字符串加上L前缀就变成了宽字符串,它包含的每个字符都是宽字符,一律采用 UTF-16 或者 UTF-32 编码。

将不加L前缀的字符称为窄字符,将加上L前缀的字符称为宽字符。窄字符使用 ASCII 编码,宽字符使用 UTF-16 或者 UTF-32 编码。

putchar、printf 只能输出不加L前缀的窄字符,对加了L前缀的宽字符无能为力,我们必须使用 <wchar.h> 头文件中的宽字符输出函数,它们分别是 putwchar 和 wprintf:

  • putwchar 函数专门用来输出一个宽字符,它和 putchar 的用法类似;
  • wprintf 是通用的、格式化的宽字符输出函数,它除了可以输出单个宽字符,还可以输出宽字符串。宽字符对应的格式控制符为%lc, 宽字符串对应的格式控制符是%ls。

在输出宽字符之前还要使用 setlocale 函数(setlocale 函数位于 <locale.h> 头文件中)进行本地化设置,告诉程序如何才能正确地处理各个国家的语言文化。(先记住)

希望设置为中文简体环境:
}

我要回帖

更多关于 char字段 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信