01. 数据类型(基础数据类型)
C语言规定在创建一个变量或者常量时,必须要指定出相应的数据类型,否则无法给变量分配内存
1.0 数据宽度
一个数据宽度为一个字节,1字节=8位,以二进制形式保存,如short为两字节16位
1.1 整型(基于MSVC编译器)
整型变量表示的是整数类型的数据
short 短整型 2字节 16位 有符号的 -32768~32767
signed short 有符号的 -32768~32767
unsigned short 无符号的 0~65535
int 整型 4字节 32位
signed int 有符号的 -2147483648~2147483647
unsigned 无符号的(首位0/1不再决定正负,代表数字大小) 0~4294967295
long 长整形 4字节 32位 一般讲long字节长度大于等于int字节长度
long long 长长整型 8字节 64位 有符号的- 9223372036854775808 ~ 9223372036854775807 无符号的0 ~ 18446744073709551615
1.2实型 浮点数
浮点型变量用于表示小数
float 单精度浮点型 4字节 -3.4E+38~3.4E+38
double 双精度浮点型 8字节 -1.79E+308~+1.79E+308
1.3 字符或字符串
字符
字符型变量用于显示单个字符
char 1字节 (ASCll) 0-255,-128-127
字符型变量并不是把字符本身放到内存中存储,而是将对应的ASCII编码放入到存储单元,编译器
将其转换为相应的二进制。
在显示字符型变量时,用单引号将字符括起来,不要用双引号,且单引号内只能有一个字符
字符串
字符串型用于表示一串字符
c 语言没有专门用于存储字符串的变量类型,字符串都被存储在 char 类型的数组中,数组由连续
的存储单元组成,字符串用" "引用,双引号中的字符由编译器自动加入末尾的 \0 字符作为结束符
如char szBuffer[]="rkvir",其字符串内存地址为 72 6b 76 69 72 00
依次代表着ASCII表对应字符:如72对应r,6b对应k等等,而00表示c语言字符串的结束符
我们在日常中难免遇到一些另类的字符串,如下讲解一种新的字符串类型:
wchar_t (unicode )2字节 16位,其字符串以L"字符"表示,内存中每个字符占两字节,该种字符
串类型应用于另类的字符串,如阿拉伯语
wchar_t szBuffer[]=L"rkvir"
内存地址 72 00 6b 00 76 00 69 00 72 00 00 00
指针 char *szBuffer = "rkvir"
数组在声明时就有了内存地址,而指针只有在赋值以后才会有地址
1.4 结构
struct 结构体
union 联合体
enum 枚举
1.5 特殊类型
auto 自动类型 自动识别相关数据的类型
void 空类型
[] 数组
* 指针类型
1.6类型修饰
static 静态变量
signed 有符号
unsigned 无符号的
const 只读的
02 变量
变量给一段指定的内存空间起名,方便操作这段内存,如下是变量表示形式:
1 变量类型 变量名 = 值 如int nNumber = 10;
2 变量类型 变量名 = 表达式 如 int nNumber = 5 + 3
变量内存
int nTemp
&nTemp &取地址符
0x00C4F8B4 为nTemp内存地址 后的变量类型宽度就是自己的空间 如int 4个字节空间
未被赋值的变量的内存地址后变量类型宽度所存在的数据为其最大可容纳的数据大小
x86操作系统内存一般3.xxGB(寻址空间)
虚拟内存 x86操作系统,每个程序都有4GB的虚拟内存,互相之间都不会干扰
内存地址0-4GB
特殊类型:数组的名字就是地址,查询数组地址时,不必加上&,直接写其数组名称
大小端字节序
字节序是多字节数据在内存中的存储顺序,分为大小端:
大端字节序:数据的高位字节存储在低地址处,低位字节存储在高地址处。存储方式符合人类书写
阅读习惯,方便人类识别。
小端字节序:数据的低位字节存储在低地址处,高位字节存储在高地址处。使得机器从低地址到高
地址读取数据时先读取到低位数据,方便机器识别和进行运算。
一般PC是低字节序,如果按平时书写习惯,从左到右是高位到地位的顺序,则例如0X12345678,
在内存中的情况是
大端字节序
12
34
56
78
小端字节序
78
56
34
12
一个整数转换为二进制时,是原码,取其补码,化作十六进制。此时按照大小端字节序进行排序,
结果即为内存地址
全局变量 局部变量 静态变量
全局变量: 全局可以使用
局部变量: 代码块内的生命周期
静态变量:
此时存在一个函数
void text()
{
static int nIndex = 0;
nIndex++;
printf("%d\r\n",nlndex)l
}
static int nIndex 存在一个函数中。
他是一个局部变量,但由关键字static修饰以后,他的生命周期便是程序的全部。
此变量全局唯一
多次利用此函数时,只有第一次,nIndex才会被初始化。此后第二次第三次调用时,nIndex不会再被初始化
03 标识符命名规则
C语言规定给标识符(变量、常量)命名时,有如下几个规则:
1.标识符要以英文字符或者下划线作为开始
2.只能由英文字符、数字、下划线组成
3.字母区分大小写
4.有效长度最多255
5.不可以是关键字
关键字
作用:关键字是C++中预先保留的单词(标识符),在定义变量或者常量时候,不要用关键字
以下是常见关键字:
auto :声明自动变量
break:跳出当前循环
case:开关语句分支
const :声明只读变量
continue:结束当前循环,开始下一轮循环
default:开关语句中的“默认”分支
double :声明双精度浮点型变量或函数返回值类型
else :条件语句否定分支(与 if 连用)
enum :声明枚举类型
extern:声明变量或函数是在其它文件或本文件的其他位置定义(声明在外部已经定义了该变量,
使用外部的变量。extern只是声明存在,变量空间有实际定义的位置开辟)
应用如 extern int nTempA 此时该地址没有内存空间,空间存在于定义它的地方
float:声明浮点型变量或函数返回值类型
for:一种循环语句
goto:无条件跳转语句
if:条件语句
int: 声明整型变量或函数
long :声明长整型变量或函数返回值类型
register:声明寄存器变量
short :声明短整型变量或函数
static :声明静态变量
switch :用于开关语句
typedef:用以给数据类型取别名
unsigned:声明无符号类型变量或函数
sizeof:用于统计数据类型所占内存大小,应用方法:sizeof( 数据类型 / 变量)
常见标准风格
int n,i; (n或i开头)
例子:int nStudentCount(微软命名风格) = 0(初始化)
n_student_count (Linux命名风格) = 0
char c,ch; 例子:char cLevel = "\0";初始化
float f,flt; 例子:float fScore = 0.0f;
double d,dbl; 例子:double dblHeight = 0.0;
char sz[],str[]; 例子 :char szName[20] = {0};
int *p,*lp; 例子 :int *pText = NULL;
04 输入与输出
输出
#include <stdio.h>
int main()
{
char cBuf = "A"
printf("Hello %c %c",cBuf,cBuf)
}
printf函数 变参函数
(变量)变量需要格式化字符
格式化数据输出到标准输入设备,此格式化数据支持正则表达式
如果函数执行成功,则返回所打印的字符总数,如果函数执行失败,则返回一个负数。
常见格式化字符串类型
%c 单个字符
%s 字符串
%ls /%S 宽字节字符串
%d 有符号十进制整数
%lld long long
%e 浮点数,e计数法
%f 浮点数,十进制计数法
%x 十六进制整数 如a
%X 大写十六进制整数 如A
%p 指针
%% 打印一个百分号
常见转义字符
转义用于表示一些不能显示出来的ASCII字符
转义字符 | 意义 | ASCII码值(十进制) |
\a | 响铃(BEL) | 007 |
\b | 退格(BS) ,将当前位置移到前一列 | 008 |
\f | 换页(FF),将当前位置移到下页开头 | 012 |
\n | 换行(LF) ,将当前位置移到下一行开头 | 010 |
\r | 回车(CR) ,将当前位置移到本行开头 | 013 |
\t | 水平制表(HT) (跳到下一个TAB位置) | 009 |
\v | 垂直制表(VT) | 011 |
\\ | 代表一个反斜线字符''\' | 092 |
\' | 代表一个单引号(撇号)字符 | 039 |
\" | 代表一个双引号字符 | 034 |
\? | 代表一个问号 | 063 |
\0 | 空字符(NUL) | 000 |
\ddd | 1到3位八进制数所代表的任意字符 | 三位八进制 |
\xhh | 十六进制所代表的任意字符 | 十六进制 |
输入
输入用于从键盘获取数据
常规的输入如下:
输入一个数字:
#include <stdio.h>
int main()
{
int nNumber = 0;
scanf("%d",&nNumber);
printf("%d",nNumber);
return 0'
}
输入一个字符串:
#include <stdio.h>
int main()
{
char szBuffer[50]; 申请字符串空间
scanf("%s",szBuffer);
printf("%s",szBuffer);
return 0;
}
输出字符串的长度
strlen()函数需要头文件<string.h> (应用此种方法计算宽字节字符串长度)
char cBuf[] = "rkivr"(定义一个字符串)
int nLength = strlen(cBuf);(strlen()获取可见字符串长度,以结束符00结尾)
printf("String Length : %d",nLength)
打印结果 String Length :5(实际是6,存在结束符00,但不会计入)
wchar_t wcBuf[] =L" rkvir"(每个字节占两位,当识别第一位时,第二位00会判别为结束符直接结束)
int nLengthw = wcslen(wcBuf);
printf("String Length : %d",nLengthw)
打印结果 String Length :5(实际是6,存在结束符00 00,但不会计入)
拼接字符串
char类型 选择sprintf()函数
char szBufA[] = "rkvir";
char szBufB[] = "Hello";
int nTempC = 12318;
char szBuffer[100];(该数组可存在100个字节)
sprintf(szBuffer,"%s %s %d",szBufA,szBufB,nTempC );
print("%s",szBuffer)
wchar_t类型 选择wsprintf()函数
05 #define和const的区别
#define 是常量,是宏。在预处理阶段会被直接替换成值
const 是修饰,是只读变量
具体区别如下:
1、编译处理阶段不同:define是在预处理阶段进行宏展开(预处理),const是在编译运行阶段。
2、类型和安全检查不同:const常量有具体的类型,在编译阶段会执行类型检查,而define没有。
3、存储方式不同:const常量会进行内存分配(C++中,对于简单类型的临时常量会保存在符号表
里面进行替换,而不会分配内存),而define仅仅是展开,不会分配内存。
4、有些调试工具可以对const进行调试,但是不能对宏定义进行调试。