02--基础数据类型

本文详细介绍了C语言中的变量定义、内存分配、整型、浮点型、字符与字符串处理、布尔类型、sizeof运算符、常量与变量的区别、标准输入方法以及man手册的使用。
摘要由CSDN通过智能技术生成

1.定义变量的语法:

变量类型 变量名 = 初始化值 ; // 定义变量并进行初始化工作

变量类型 变量名 ; // 定义变量并没有进行初始化操作 该内存中的值是未知

 

2.内存大小:

二进制位 --> 字节 
8个二进制位  = 1个字节
8bit  = 1 byte 

3.整型

- 概念:表达整数类型的数据
- 语法:
- int  变量名 = 初始化值 ;
int a = 123; // 定义了一个专门用来存储整数的变量a 

 需要注意的地放:


1.int 的本意是 integer,即整数的意思
2.int a 代表在内存中开辟一块小区域,称为 a,用来存放整数,a 一般被称为变量(实际上代表一片内存)。
3.变量 a 所占内存大小,在不同的系统中是不一样的,64位和32位系统典型的大小是4个字节
undefined.变量 a 有固定的大小,因此也有取值范围,典型的范围是:-2147483648到2147483647

4.整型修饰符

- short:用来缩短整型变量的尺寸,减少取值范围并节省内存,称为短整型 (2byte)
- long:用来增长整型变量的尺寸,增大取值范围并占用更多内存,称为长整型 (大小取决于系统的位数)
- long long:用来增长整型变量的尺寸,增大取值范围并占用更多内存,称为长长整型
- unsigned:用来去除整型变量的符号位,使得整型变量只能表达非负整数
short int a; // 短整型
long int b;  // 长整型
long long int c; // 长长整型

unsigned int e;  // 无符号整型

unsigned short int f; // 无符号短整型
unsigned long int g;  // 无符号长整型
unsigned long long int h; // 无符号长长整型



使用整型修饰符后,关键字 int 可以被省略:
short a; // 短整型
long b;  // 长整型
long long c; // 长长整型

unsigned e;  // 无符号整型

unsigned short f; // 无符号短整型
unsigned long g;  // 无符号长整型
unsigned long long h; // 无符号长长整型

5.符号位

  • 有符号的整型数据,首位(最高位)为符号位,0表示正数,1表示负数。
  • 无符号的整形数据,没有符号位。

6.编码形式

  • 原码:正数直接使用二进制来表达,比如a=100,在内存中是 00…001100100
    • 补码:负数用绝对值取反加一来表达,比如a=-3,在内存中是11…1111111101
    • 注意负数的补码在取反加一的时候,符号位是不动的

7.溢出

超过数据所能表达的范围,称为溢出,就像汽车里程表,最大值和最小值是相邻的

8.进制

- 源码中可以使用八进制、十进制或十六进制,但实际数据在内存中一律是二进制
- 十进制(默认),比如1099
- 八进制,比如013   
- 十六进制,比如0x6FF0A

9.格式控制符

- int 整型:%d   十进制的整形
- short 整型:%hd, h代表half,即一半的存储字节
- long 整型:%ld
- long long 整型:%lld
- 显示不同进制的前缀: %#o、 %#x  , %o %x

10.浮点型


- 概念:用来表达实数的数据类型 (实型)
- 分类:
- 单精度浮点型(float),典型尺寸是4字节
- 双精度浮点型(double),典型尺寸是8字节
- 长双精度浮点型(long double),典型尺寸是16字节
- 占用内存越多,能表达的精度越高
float f1; // 单精度
double f2; // 双精度
long double f3; // 长双精度


浮点型输出控制符:
%f   浮点输出 float  double 
%Lf  长的双精度 long double 

11.字符

字符型的数据本质上就是一个单字节的整形。
char ch1 = 'a';  // 'a'是字符常量,代表字母a  编码为 97 
char ch2 = '\n'; // '\n'是不可见字符常量,代表回车 编码为 10 
计算机中存储的都是1和0,因此各种字符都必须被映射为某个数字才能存储到计算机中,
这种映射关系形成的表称为 ASCII 码表。

12.字符串

- 定义
// 字符串的定义方式有两种:指针和数组
char *s1 = "abcd"; // 使用字符指针来表示字符串
char s2[]= "abcd"; // 使用字符数组来表示字符串

// 注意,使用数组来定义字符串时,方括号[]里面的数字可以省略
// 不省略也可以,但必须必字符串实际占用的内存字节数要大,比如:
char s3[] = "apple";

- 在内存中的存储
- 在内存中实际上是多个连续字符的组合
- 任何字符串都以一个 ‘\0’ 作为结束标记,例如:“funny story” 的内存如下

如何定义及使用字符串类型的变量:

#include <stdio.h>

int main(int argc, char const *argv[])
{
    char * s1 = "Hello WY" ; // 变量 s1 中存储了 字符串常量 "Hello WY" 的地址

    printf("s1: %s \n" , s1 );

    // 由于s1 指向的内存地址是一个常量数据的地址
    // *s1 = 'h' ; // [错误] 会出现 Segmentation fault (core dumped) 段错误 【在访问内存时如果出现越界或非法访问的情况下会出现该错误】
    
    char arr[] = "Hello WY" ; // 把字符串 "Hello WY" 存储到 数组arr所代表的内存空间中

    printf("arr:%s\n" , arr );

    *arr = 'h' ;  // [允许] 由于arr并不是一个指针,而是一个数组,数组所占用的内存可以被修改
    printf("arr:%s\n" , arr );

    return 0;
}

小结:

字符串与字符数据的最大区别是:

字符是一个单独字符

字符串则是由多个字符连续存放形成一整片内存, 并在末尾处需要添加 一个 \0 作为结束标记 (一般情况会自动添加)

13.布尔类型

- 概念:布尔型数据只有真、假两种取值,非零为真,零为假。
- 语法:
bool a = 1; // 逻辑真,此处1可以取其他任何非零数值
bool b = 0; // 逻辑假 
bool c = true ; // true 的值是 1 
bool d = false ; // false 的值 0 
- 注意:
1.逻辑真除了 1 之外,其他任何非零数值都表示逻辑真,等价于 1。
2.使用布尔型 bool 定义变量时需要包含系统头文件 stdbool.h。
- 布尔型数据常用与逻辑判断、循环控制等场合。

14.sizeof运算符

作用: 用于计算变量 或 变量类型的大小尺寸。
语法:sizeof ( 变量 / 变量类型 )
使用:
int size_a = sizeof(a);  // sizeof 可以直接对变量名字进行运算
int size_bool = sizeof(bool); // sizeof 可以直接对变量类型进行运算

printf("a: %d bool:%d \n" , size_a , size_bool);

printf("true:%ld false:%ld\n" , sizeof(true) , sizeof(false));

printf("%d,%d\n" , true , false );

15.常量与变量

- 概念:不可改变的内存数据称为常量,可以改变的内存数据称为变量
- 举例:
int a = 100;    // a是变量,而100是常量
float f = 3.14; // f是变量,而3.14是常量
char s[] = "abcd"; // s是变量,"abcd"是常量
  • 常量的类型
  • 常量举例

    说明

    类型

    100

    整型

    int

    100L

    长整型

    long

    100LL

    长长整型

    long long

    100ULL

    无符号长长整型

    unsigned long long

    3.14

    双精度浮点型

    double

    3.14L

    长双精度浮点型

    long double

    ‘a’

    字符型

    char

    “abcd”

    字符指针(字符串)

    char *

16.标准输入

- 概念:键盘是系统的标准输入设备,从键盘中输入数据被称为标准输入
- 相关函数:
int scanf(const char *format, ... ); // 格式化输入函数

int a;
float f;

scanf("%d", &a);   // 从键盘输入一个整型,放入指定的内存地址 &a 中
scanf("%f", &f);   // 从键盘输入一个浮点数,放入指定的内存地址 &f 中

scanf("%d%f", &a, &f); // 从键盘依次输入一个整型和一个浮点型数据,用空白符隔开

char c;
char s[10];
scanf("%c", &c);  // 从键盘输入一个字符,放入指定的内存地址 &f 中
scanf("%s", s );  // 从键盘输入一个单词,放入指定的数组 s 中(注意不是&s)

fgets(s, 10, stdin); // 从键盘输入一行字符串,放入数组 s 中

scanf的异常问题:
printf("请输入一个整型以及字符型数据:\n");
// 在使用scanf 获取数据值必须严格按照代码中的格式进行输入
int Ret_val = scanf( "%c %d" , &ch , &Num ); // 分别获取两个数据 并出入到对应的内存中

printf("成功获得%d项输入...\n" , Ret_val);

printf("Num:%d ch:%c\n"

scanf   的异常问题:

scanf的异常问题:
printf("请输入一个整型以及字符型数据:\n");
// 在使用scanf 获取数据值必须严格按照代码中的格式进行输入
int Ret_val = scanf( "%c %d" , &ch , &Num ); // 分别获取两个数据 并出入到对应的内存中

printf("成功获得%d项输入...\n" , Ret_val);

printf("Num:%d ch:%c\n" , Num , ch  );

// 如果前面上一次使用scanf 时出现了异常,那么会有数据被scanf留在缓冲区中,
// 因此会导致下一次使用scanf 获取数据时出现异常情况
int Other = 0 ;
scanf("%d" , &Other);
printf("Other:%d\n" , Other);

getchar 从标准输入中获取一个字符

int getchar(void);
    参数分析:
        void  --> 无需参数 (使用该函数的时候无需要传递任何的参数)
    返回值:
        成功 返回该字符所对应的ASCII码值
        失败 返回 EOF --> -1 
        
        
scanf("%d %f %c" , &a , &b , &c );
while( getchar() != '\n' ) ;  // 不断使用 getcahr 函数从标准输入中获取一个字符

17.换行符 \n 的作用

概念: 提供一个换行的标记
在使用打印函数printf进行输出的时候,默认是直接把数据输出到标准输出文件中,
而标准输出文件默认是具有缓冲区的,而且缓冲类型为行缓冲(当有一行数据到达缓冲区时,
数据才会被刷新到终端上)。

注意:
     在使用printf 打印数据的时候如果需要把数据实时显示出来则需要添加 \n 换行符,
来让缓冲区及时刷新。
也可是使用另外一个输出的函数 :
int printf(const char *format, ...);  // 默认把数据直接输出到标准输出文件中 【行缓冲】
int fprintf(FILE *stream, const char *format, ...); // 把数据输出到指定的文件stream 中
int dprintf(int fd, const char *format, ...); //  把数据输出到指定的文件fd 中
int sprintf(char *str, const char *format, ...); // 把数据进行格式化处理后存入到指定内存中str
int snprintf(char *str, size_t size, const char *format, ...);// 与上一个相同,但是有控制写入内存的字节大小 【安全版本】

实例:
// // 如果想要输出一个%百分号, 则需要在输出语句中写两个%%

printf("a%%b:%d" , a%b);

printf("b%%a:%d" , b%a);

使用以下方式输出则不需要添加\n也能实时输出  
 标准出错文件默认是无缓冲(任何数据到达都会立即输出)



// stderr 为标准出错的文件指针

fprintf(stderr, "a%%b:%d" , a%b);

// 2 为标准出错的文件描述符 (文件编号)

dprintf( 2 , "a%%b:%d" , a%b);

18.man 帮助手册

man手册是编程开发中获取第一手资料的权威通道。由于所需要罗列的帮助条目众多,因此man手册被妥善地分为9册,不同的帮助信息被放入对应的man分册中:
- man文档的九个分册:
Shell命令(默认已安装)
系统调用  // 该手册中所有的函数都是有系统内核直接提供接口
库函数  // 该手册中所有的函数都是有第三方库提供 (标准C库)
特殊文件(通常出现在/dev目录下)
文件的特殊格式或协定(例如/etc/passwd的格式)
游戏
杂项(例如一些宏定义)
系统管理员命令(通常只能由管理员执行)
非标准内核例程 // 例子代码

gec@ubuntu:~$ sudo apt-get install manpages
gec@ubuntu:~$ sudo apt-get install manpages-dev
gec@ubuntu:~$ sudo apt-get install manpages-posix
gec@ubuntu:~$ sudo apt-get install manpages-posix-dev

使用man手册查询命令、函数时,一般直接在man后面接上待查条目即可,但有时候会遇到同一个待查询的条目存在于多个man分册的情况,这就需要先罗列出该条目所在的分册信息,然后再根据需要去选择帮助文档的序号。

如何查询man 手册:

使用 -f 选项可以列出 指定的条目 open 出现在哪些手册中,在根据实际所需进行查询指定的手册即可

man -f open

比如需要查找的是系统函数手册 man 2 open

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值