c学习0-6

知识点1【数据类型】


数据的不同类型 目的:合理的利用空间
char shout int long float double
计算机存储的是二进制。一位二进制只能存放 0 或 1  1b

1字节 == 8b(8位二进制)0000 0000 ~ 1111 1111
1B == 8b
1KB == 1024 B   
1MB == 1024 KB
1GB == 1024 MB
1TB == 1024 GB
1PB == 1024 TB

-----------32位平台---------------
char   字符类型         占1字节的空间(8位二进制)
short  短字符型       占2字节的空间(16位二进制)
int    整形              占4字节的空间(32位二进制)
long   长整形         占4字节的空间(32位二进制)
float  单精度浮点型  占4字节的空间(32位二进制)
double 双精度浮点型     占8字节的空间(64位二进制)

案例:验证数据类型的长度

sizeof 测量数据类型的长度(用法如下):

#include<stdio.h>
int mian(int argc,char *argv[])
{
    printf("sizeof(char)=%d\n",sizeof(char));
    printf("sizeof(short)=%d\n",sizeof(short));
    printf("sizeof(int)=%d\n",sizeof(int));
    printf("sizeof(long)=%d\n",sizeof(long));
    printf("sizeof(float)=%d\n",sizeof(float));
    
    return 0;
}

知识点2【unsigned 和 signed】 (重要)


1、无符号数 unsigned
数据没有符号位,自身所有的二进制位都是数据位
比如:unsinger chat 0000 0000 ~ 1111 1111

2、有符号数 signed 默认一般省略
二进制的最高位为符号位,其他位为数据位。

signed char xxxx xxxx (x:0~1) 
最高位为 1 表示负数,最高位为 0 表示正数
负数:1xxx xxxx 正数:0xxx xxxx
signed cahr 的表示范围: 1111 1111~1000 0000~0000 0000~01111 1111
案例:一字节:-10 
      1000 1010(-10的原码)


      
案例:

#include<stdio>
int mian(int argc,char *argv[])
{
    //定义一个有符号int
    signed int numl = 10;//    signed 默认一般省略
    int num2 = 10;    //num2也是有符号int
    
    //unsigned 表示无符号数 不能省略
    unsigned int num3 = 10;
    
    return 0;
}


知识点3【 struct 结构体 和 共用体 union】


1、struct 结构体 中的成员 拥有独立的空间

struct data1{
    char 1;
    short b;
    int c;
}//设想为大学的床位,每一个人都有自己的床位

a,b,c,就是结构体中独立的成员

2、 union 共用体 中的成员 共享同一份空间

union data2{
    char a;
    short b;
    int c;
}//设想大学宿舍的厕所,a,b,c,都可以去上一个厕所

知识点4【enum 和 void】


1、enum 枚举 将变量要赋的值一一列举出来
enum BOOL{false,true};
enum BOOL bool = false;

2、void 无类型(重要)
不能用 void 定义变量
int num;//√
void num;//× 系统不能确定给num开辟多大的空间

知识点5【其他关键字】(了解)


   auto自动类型,(自动的字节长度 auto mun;)
   register寄存器变量,
   static静态变量,
   const只读变量,
   sizeof测类型的大小,
   typedef为已有的类型 重新取一个别名
   volatile防止编译器优化
   
1、register int num;//尽量将num放入寄存器中


总结:
1、如果没有显示表明 register(int num),如果num被高频繁使用 系统也会放入寄存器中
2、register int num ;//显示将num放入寄存器中
3、寄存器的变量 不能取地址 &num

#include<stdio.h>
int mian (int argc,char *argv[])
{
    register int num = 10;
    //%p输出地址
    printf("%p\n",&num);//错误,寄存器变量不能取地址
    
    return 0;
    
}

2、typedef 为已有类型取个别名
 

#include<stdio.h>

//给已有的int类型取个别名
typedef int INT32;

int mian(int argc,*argv[])
{
    test01();
    
    return 0;
    
}

void test01()
{
    int num1 = 10;
    INT num2 = 20;
    printf("num1 = %d\n",&num1)
    printf("num2 = %d\n",&num2)
}

3、volatile 防止编译器优化 强制访问内存操作
不能将常用数据存于寄存器中,必须从内存中读取,保证检测数据的及时更新
volatile int value;

知识点6【常量与变量】(重要)


1、常量 值不能被修改 (反:值不能被修改就是常量 ×)
常见的如 10 20 30 'a' "abcd"

2、变量 系统根据变量的类型 开辟对应的空间 其值可以被修改
变量名 代表的是 空间的内容
操作变量 就是 对空间内容的操作
变量名的命名规则:由数值、字符、下划线组成 但 不能以数字开头

A、num_1 B、_num1 C、1_num D、num  //其中c是错误的
int num = 10;//变量名num代表的是空间的内容

知识点7【整形常量】(了解)
十进制:0~9
八进制:0~7
十六进制:0~15

八进制 十进制 十六进制 都是整形的输出形式。

void test03()
{
    int num = 100;
    //十进制输出
    printf("十进制:num=%d\n",num);
    //八进制输出
    printf("八进制:num=%o\n",num);
    //十六进制输出
    printf("十六进制:num=%x\n",num);
    //如果加上 # ,就可以在数字前面加上一定的标识符
    //例如 
    printf("十六进制: num=%#x\n",num);
    //不同进制 仅仅是数据的表现形式 不会修改数据本身(重要)

}

知识点9【整形变量的操作————读、写】取值赋值

void test04()
{
    //局部变量不初始化,内容随机
    int data = 0;
    int num = 0;
    printf("num = %d\n",num);//读 取值
    
    num = 100
    printf("num = %d\n",num);//读 取值
    
    data = 100;
    printf("num = %d\n",num);//读 取值
    
    //从键盘输入
    printf("请输入一个int数据:");
    scanf(%d,&data);//&data 代表的事data对应空间的起始地址
    printf("num = %d\n",num);//读 取值    
    
}

运行结果:
2、整形的输出形式

void test05()
{
    int num1 = 0;
    //%d 有符号int形数据输出
    printf("num1 = %d\n",num1);
    
    unsigned int num2 = 0;
    //%u 无符号int形数据输出
    printf("num2 = %u\n",num2);
    
    long num3 = 0;
    //%ld 有符号long形数据输出
    printf("num3 = %ld\n",num3);
    
    unsigned long num4 = 0;
    //%lu 有符号long形数据输出
    printf("num4 = %lu\n",num4);
    
    short num5 = 0;
    //%hd 有符号short形数据输出
1    printf("num5 = %hd\n",num5);

    unsigned short num6 = 0;
    //%hd 无符号short形数据输出
1    printf("num6 = %hu\n",num6);

}

unsigned short num6 = 0;
scanf("%hu",&num6);//输入

知识点10【实型 常量】

void test06()
{
    float f = 3.14;//会有个小报错
    float f = 3.14f;//前后长度一样
    //printf("f = %f\n",f);  输出float数据
    //printf("d = %lf\n",d);  输出double数据
    //scanf("%f",&f);
    //scanf("%lf",&d);
    
    //不以f结尾的 实型 为double类型
    printf("sizeof(3.14) = %d\n",sizeof(3.14))/8
    
    //以f结尾的 实型 为float类型
    printf("sizeof(3.14f) = %d\n",sizeof(3.14f))//4

}

单精度(float)双精度(double) 
float :占4字节,7位有效数字,指数-37~38
double:占8字节,16位有效数字,指数-307~308


知识点11【字符常量和变量】
1、字符常量(char类型 0~127)和变量

void test07()
{
    //%c 输出的字符
    printf("%c\n",'a');    
    
    //字符变量
    //ch 存储的是‘a’的ASCII值
    char ch = 'a';
    printf("%c\n",ch);    //%c 输出的是字符
    printf("%d\n",ch);    //%d 输出的是ASCII值
    
    //'a' 单引号 表示取 字符的ASCII
    //'a' == 97 完全等价
    
    ch = ch + 1;
    printf("%c\n",ch);    //%c 输出的是字符
    printf("%d\n",ch);    //%d 输出的是ASCII值

}

总结:
1、'a'单引号 表示取a的ASCII值
2、字符在计算机存储的是ASCII值

void test08()
{
    char ch = 'a';
    printf("%d\n",sizeof('a'));//'a'表示的是97,数值默认是整形
    printf("%d\n",sizeof(char));//表示的是char这个类型
    
}
void test09()
{
        char ch;
        printf("请输入一个字符:");
        scanf("%c"&ch);
        //scanf中的%c只能提取一个字符
        //ch = getchar();//获取一个字符
        //getchar();//丢弃一个字符
        
        printf("ch = %c",ch);
        printf("ch = %d",ch);
    
}

案例:提高 键盘输入“abc” 只取‘a’‘c’

void test10()
{
    //  '\n'  换行
    //  ‘\t'  tab
    printf("##%c##"\n,'\\');//两个\\输出一个\
    printf("##%%##"\n);
    
    
    printf("%d\n",'0')//48
    printf("%d\n",\0)//0
    printf("%d\n",0)//0
    printf("%d\n","0")//字符0的地址,地址编号

    
}

知识点13【字符串】""双引号作用 

void test11()
{
    //%s 输出字符串
    //''取得是字符的ASCII值 ""取得是字符串的首元素的地址
    //%s 从字符串的首元素 逐个字符输出 遇到'\0'结束
    printf("%s\n","hello");
    //系统会在字符串末尾自动添加一个结束字符'\0'
    printf("%d\n",sizeof("hello\0"));//输出为6 原因在上面
        
    printf("%s\n","hello woeld");
    printf("%s\n","hello\0 world");
    printf("%s\n","\0hello\0 world");
}

例如:描述'a'和"a"的区别

'a'是字符 占1字节
"a"是字符串 占2字节

void test12()
{
    printf("##############");
    //%5d 表示占5个终端位宽 右对齐
    printf('###%5d##'\n,123);
    
    //%-5d 表示占5个终端位宽 左对齐
    printf("##%-5d##,"123);
    
    printf("##%05d##\n",123);
    
    printf("##%-05d##\n",123);//不能这么写 会改变数据加0 所以不会起作用
    
    //%5.2f 5表示总位宽为5 .2表示小数点保留两位
    printf("##%5.2f\n##,"3.14159f);//3.14
}


知识点15【typedef】

为已有的类型重新 取个别名
1、用已有的类型 定义一个变量
2、用别名 替换 变量名
3、在整个表达式的前方加上typedef

案例1:
    int INIT32;
    typedef int INT32;
    
案例2:给 int arr[5] 取个别名 ARR
    typedef int ARR[5];
    ARR arr;//arr就是一个拥有5个int元素的数组

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值