C语言基础(二) 基础数据类型与输入输出

01. 数据类型(基础数据类型)

1.0 数据宽度

字节  如short为两字节 1字节=8位 二进制形式

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,编译器将其转换为相应的二进制。单字符用' '

内存中每个字节占一位,用十六进制表示

数组 char szBuffer[]="rkvir" 字符串用" "

c 语言没有专门用于存储字符串的变量类型,字符串都被存储在 char 类型的数组中

数组由连续的存储单元组成

双引号中的字符和编译器自动加入末尾的 \0 字符作为结束符

内存地址 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 nTemp

&nTemp &取地址符

0x00C4F8B4 为nTemp内存地址 后的变量类型宽度就是自己的空间 如int 4个字节空间

未被赋值的变量的内存地址后变量类型宽度所存在的数据为其最大可容纳的数据大小

x86操作系统内存一般3.xxGB(寻址空间)

虚拟内存 x86操作系统,每个程序都有4GB的虚拟内存,互相之间都不会干扰

内存地址0-4GB

特殊类型:数组的名字就是地址,查询数组地址时,不必加上&,直接写其数组名称

内存地址

大小端字节序:

字节序是多字节数据在内存中的存储顺序。字节序分为大小端:

大端字节序:数据的高位字节存储在低地址处,低位字节存储在高地址处。存储方式符合人类书写阅读习惯,方便人类识别。
小端字节序:数据的低位字节存储在低地址处,高位字节存储在高地址处。使得机器从低地址到高地址读取数据时先读取到低位数据,方便机器识别和进行运算。

一般PC是低字节序,如果按平时书写习惯,从左到右是高位到地位的顺序,则例如0X12345678,在内存中的情况是

高地址 
12 
34 
56 
78 
低地址

一个整数转换为二进制时,是原码,取其补码,化作十六进制。此时按照大小端字节序进行排序,结果即为内存地址

全局变量 局部变量 静态变量

全局变量: 全局可以使用

局部变量: 代码块内的生命周期

静态变量: 

此时存在一个函数

void text()

{

    static int nIndex = 0;

    nIndex++;

    printf("%d\r\n",nlndex)l

}

static int nIndex 存在一个函数中。

他是一个局部变量,但由关键字static修饰以后,他的生命周期便是程序的全部。

此变量全局唯一

多次利用此函数时,只有第一次,nIndex才会被初始化。此后第二次第三次调用时,nIndex不会再被初始化

03 量命名风格

1.变量名要以英文字符或者下划线作为开始

2.不可以包含空格,标点符号和类型说明符以及运算符

3.字母区分大小写 

4.有效长度最多255

5.不可以是关键字

关键字

auto :声明自动变量

break:跳出当前循环

case:开关语句分支

char :声明字符型变量或函数返回值类型

const :声明只读变量

continue:结束当前循环,开始下一轮循环

default:开关语句中的“默认”分支

do :循环语句的循环体

double :声明双精度浮点型变量或函数返回值类型

else :条件语句否定分支(与 if 连用)

enum :声明枚举类型

extern:声明变量或函数是在其它文件或本文件的其他位置定义(声明在外部已经定义了该变量,使用外部的变量。extern只是声明存在,变量空间有实际定义的位置开辟)应用如 extern int nTempA 此时该地址没有内存空间,空间存在于定义它的地方

float:声明浮点型变量或函数返回值类型

for:一种循环语句

goto:无条件跳转语句

if:条件语句

int: 声明整型变量或函数

long :声明长整型变量或函数返回值类型

register:声明寄存器变量

return :子程序返回语句(可以带参数,也可不带参数)

short :声明短整型变量或函数

signed:声明有符号类型变量或函数

sizeof:计算数据类型或变量长度(即所占字节数)

static :声明静态变量

struct:声明结构体类型

switch :用于开关语句 

typedef:用以给数据类型取别名

unsigned:声明无符号类型变量或函数

union:声明共用体类型

void :声明函数无返回值或无参数,声明无类型指针

volatile:说明变量在程序执行中可被隐含地改变

while :循环语句的循环条件

常见标准风格

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 

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码值(十进制)

\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 

int main()

{

    int nNumber = 0;

    scanf("%d",&nNumber);

    printf("%d",nNumber);

    return 0'

}

#include 

int main()

{

    char szBuffer[50];

    scanf("%s",szBuffer);

    printf("%s",szBuffer);

    return 0;

}

scanf和scanf_s的区别

int main()

{ char a = 0;

    scanf_s("%c", &a, 1);

    return 0;

}

scanf_s有三个参数格式分别是参数部分,地址部分和变量所占据空间的大小(单位为字节)

如上述程序最后一个参数可以写1,也可以写sizeof(a)。

   ( scanf_s("%c", &a, sizeof(a));)

如果a为整型的话,第三个参数就为4,或者sizeof(a)。

如果输入整型数据,scanf函数的里面的sizeof()是在所有取地址的后面,而输入字符,每个取地址后面需要有一个sizeof()

scanf_s("%d %d", &a, &b, sizeof(a),sizeof(b));

scanf_s("%c %c", &a, sizeof(a), &b, sizeof(b));

scanf_s输入的相关细节

如%d %d(%d%d之间有空格),那么通过标准输入设备(键盘)输入时两个整型之间也加一个空格。

如%d,%d(%d%d之间逗号),那么通过标准输入设备(键盘)输入时两个整型之间也加一个逗号。

如%d%d(%d%d之间什么都没有),那么通过标准输入设备(键盘)输入时两个整型之间可以空格或者回车

输出字符串的长度

strlen()函数需要头文件 (应用此种方法计算宽字节字符串长度)

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进行调试,但是不能对宏定义进行调试。
 

你可能感兴趣的:(c语言,开发语言)