C语言-常量/变量

 

常量

  • 定义:描述一些固定的数据,不能改变的数据
  • 常量的分类:
    • 整型常量
      • 二进制
      • 八进制
      • 十六进制
    • 实型常量
      • 单精度float
      • 双精度double
    • 字符型常量
      • char
    • 字符串常量
      • 用双引号引起来的就是字符串常量
#include <stdio.h>

int main() {
    // 整型常量
    10// 实型常量(小数)
    // 单精度float/双精度
    // 注意默认情况下都是双精度的实型常量也就是所有小数都是默认double
    10.1; // 双精度double
    88.8; // 双精度double
    5.2f; // 单精度float
    
    // 字符型常量,用单引号扩起来的就是字符型常量
    // 注意:字符型常量只能写一个字符,写多个会报错除了\r,\n,\t,\f,\\,\',\'',\ddd
    'a'; // 字符型常量
    'ab'; // 错误
    '1';
    ‘12’;
    ‘1’; // 这个是么?
    
    // 字符串型常量,用双引号引起来的就是字符串常量
    // 注意:无论你用双引号l括起来几个字符,只要是使用双引号扩起来就是字符串常量
    "abc";
    "a"
    return 0;
}

 


变量

  • 什么是变量

    • 表示的数据可以经常被修改,当一个数据的值不确定,或者经常被修改的时候就应该用变量来表示

    • 比如说:游戏积分,页码

  • 如何定义变量

    1. 申请一块存储空间,也就是定义一个变量

    2. 定义变量的格式,数据类型,变量名称

    3. 定义一个基本数据类型的变量(int,float,double,char)

    4. int number; // 定义一个n名称叫做number的变量,会在内存空间中开辟一块给number,用于存储数据
      int value; // 再开辟一块空间给value

      ![image-20200506235143526](/Users/mac/Library/Application Support/typora-user-images/image-20200506235143526.png)

    5. 连续定义变量

      int number1,number2; // 连续开辟两个存储空间分别给number1,number2
    6. 如何往变量对应的存储空间中存储数据呢?

      注意:变量中不能随便的存储数据,只能存储与之对应的数据,也就是说之前申请内存空间为int类型,那就只能存储int类型,如果存储float,double会出一些问题

      int number;
      number = 2; // 这时候会把数据2这个值放在申请好了的number的存储空间中
    7. 变量的第一次赋值称之为初始化

      • 要想使用变量都必须先对变量进行初始化,然后才能使用
      • 如果不对变量进行初始化,那么其实变量存储的就是一些垃圾数据
    8. 如何使用变量

      • 要使用占位符

      • int number = 10;
        printf("%i",number);
    9. 变量初始化的两种方式

           // 初始化的两种方式
          // 1,先定义再初始化赋值
          int value1;
          value1 = 10;
          
          // 2,定义的同时初始化
          int value2 = 10;
    10. 完全初始化

          // 完全初始化
          int value3, value4;
          value3 = value4 = 10; // 把10赋值给value4,再把value4的值赋值给value3
      
          int value3,value4;
          value4 = 10;
          value3 = value4;
    11. 部分初始化

          // 部分初始化
          int value5,value6 = 10; // 开辟两个存储空间value5,value6,将10的值赋值给value6,但是value5并没有给赋值
    12. 如何修改变量的值

      int number = 10; // 定义并初始化一个变量number,将10的值赋值给number
      number = 20; // 将20的值赋值给变量number,此时number的内存空间没有是10,只有20了。它只能存一个值
    13. 变量之间的值传递

      int number = 10; // 定义并初始化一个变量number,将10的值赋值给number
      int number1 = number; // 将number的值赋值给number1,此时会先去找number这个变量的内存地址,找到内存地址取出存的值,将这个值赋值给number1
    14. 连续赋值

      int a,b,c; // 定义并初始化三个变量a,b,c
      a = b = c = 10; // 将10的值赋值给c,再将c的值赋值给b,再将b的值赋值给a 
    15. 如何查看变量的值(简单用法)

      // int类型
      int number = 10;
      printf("number的值是%i",number) //使用%i
      
      // float类型
      float FloatNumber = 20.0f; // float类型要加上f标示,默认是double类型的
      printf("FloatNumber的值是%f",FloatNumber) // 使用%f
         
      // double类型
      double DoubleNumber = 30.01234567890;
      printf("DoubleNumber的值是%lf",DoubleNumber) //使用lf,longfloat
      printf("DoubleNumber的值是%.10lf",DoubleNumber) // printf函数默认强制输出小数点后6位,想要输出双精度的需要指定你要输出小数点后面几位
      // char类型
      char CharNumber = 'a';
      printf("CharNumber的值是%c",CharNumber) // 使用%c

    变量的作用域

    • c语言中所有变量都有自己的作用域,根据作用域的不同分为局部变量和全局变量。

          int main(){
              a = 10;
              int a ; // 变量的作用域是从定义的哪一行开始,到大括号结束,报错
              return 0; // return 代表函数的结束,只要执行到这里就代表这个函数结束了
          }
    • 例如:把变量放在rerurn后面执行--报错

      int main(){
          int number;
          number = 10;
          return 0 ;
          printf("%i",number); // 此时number在return的后面,number的作用域也就消失了
      }
    • 例如:不同函数之间的变量作用域是不一样的,不能相互调用的

      int call(){
          int number;
          return 0;
      }
      
      int main(){
          number = 10;
          printf("%i",number); // 此时在main函数中调用call函数中的变量number,会报错。number在call函数中,他的作用域之存在于call的函数内存空间中。
          return 0; 
      }
    • 例如:在同一函数中,函数的嵌套时,内层函数可以使用外层函数的变量,外层函数不能使用内层函数的变量

      int main(){
          int number;
          
          {
              number = 10;
              printf("%i",number);// 此时可以正常打印,外层中number时遇到她所在的内存空间,他和{printf("%i",number)}是同一级别的
          }
          
          return 0;
          
      }
      int main(){
          
          {
              int number;
              number = 10;
          }
          printf("%i",number); // 此时是错误的,number的变量存储在{}中,并不在main()函数中
          return 0;
          
      }

       

    • 例如:变量查找的顺序(第一种)

      • 如果自己的作用域中有就使用自己的
      • 不同的作用域中可以定义相同的变量名称
      • 统一范围内不能出现同名的变量
      int main(){
          int number;
          {
              int number = 20;
              printf("%i",number); // 20,变量名称相同,先查找本内存空间的变量number也就是20
          }
          printf("%i",number); // 0,因为在此内存空间中有number的变量,但是并没有初始化所以是0,也可能是其他的数字,随机的
          return 0;
          
      }

       

变量的内存分析

  • 内存和字节的关系

    • 每块内存都是连续的
    • 每块内存的大小都是一样的
    • 合理的分配内存会节省很多空间

  • 一个变量所占用的内存空间,不仅跟变量的类型有关系,还跟编译环境有关系

    • 同一个变量类型在不同的编译环境下所占用的存储空间是不一样的-这就是我们要定义变量类型的原因(优化存储空间)

    • 内存由大到小寻址

      // 内存空间分析
      int main(){
          // 内存寻址从大到小,按照这种规则那么先定义的变量内存地址肯定比后定义的要大
          int number = 0;
          int value = 0;
          
          printf("number的内存地址是%p\n",&number); // 使用%p占位符,&符号就可以获取变量的内存地址,打印出来的是16进制
          //a,    b,  c,  d,  e,  f
          //10,   11, 12, 13, 14, 15
          printf("value的内存地址是%p\n",&value);
          return 0;
          
      }

       

    • 变量存储单元的第一个字节地址就是该变量的地址

    • 任何变量在存储空间都是二进制存在的

 

类型 16位编译器 32位编译器 64位编译器
char 1  1 1
int 2 4 4
float 4 4 4
double 8 8 8
short 2 2 2
long 4 4 8
long long 8 8 8
void * 2 4 8

 

posted @ 2020-11-18 15:38  空间移动工程师  阅读(184)  评论(0编辑  收藏  举报