C语言|C语言 内存分析 数组知识点整理

内存分析
  1. 在计算机中1个字节占用8位
  2. 定义变量的目的就是为了在内存中开辟一块存储空间
  3. 定义变量时指定数据类型的目的就是为了告诉计算机需要开辟多大的存储空间
  4. char在内存中占用一个字节, int在内存中占用4个字节, double在内存中占用8个字节sizeof(char); sizeof(int); sizeof(double);
内存分配的规则
  • 计算机分配内存的规则: 从大到小的分配
  • 变量名称对应的是变量占用内存最小的那个字节
ASCII码
  • ASCII码是一套字符对应的数值表
  • http://tool.oschina.net/commons?type=4
总结: 字符存储的顺序:
  1. 根据字符在ASCII码表中找到对应的十进制数
  2. 将找到的十进制数转换为二进制
  3. 将转换好的二进制存储到内存中
类型说明符
  • 类型说明符一般都是用于修饰int类型的
    • 1.说明长度的
* short---- > %hi --占位符 * long ---- > %li --占位符 * long long ---- > %lli --占位符 * ------------------------------------ * char 1个字节-2^7~2^7-1-128~127 * short int 2个字节 -2^15~2^15-1 * int4个字节-2^31~2^31-1 * long int: * 如果在32位编译器中, long int 占用4个字节 * 如果在64位编译器中, long int 占用8个字节 * * long long int 8个字节 -2^63~2^63-1

注意点:
  1. 如果存储的数据超出了类型对应的取值范围, 那么就会导致存储的数据不对
  2. 由于内存非常有限, 所以在编写程序的时候, 尽量合理的定义变量
  3. C语言不看怎么存, 只看怎么取
说明符号位的
  • unsigned 无符号的:
  • 不把二进制的第一位当做符号位来使用, 所以只能存储0正数, 不能存储负数
  • 注意点:
  • 如果变量被unsigned修饰了, 那么取出的时候必须使用%u, %u就代表用无符号的方式取出
unsigned int num1 = -6; printf("num1 = %u\n", num1);

  • 应用场景: 存储银行存款, 学生的分数等不能出现负数的情况
signed 有符号的:
默认int就是有符号的, 就可以保存负数,零,正数, 所以signed一般用不上
数组
  1. 应用场景
  • 如果想要同时保存多个``相同类型的数据的时候, 就要想到数组
  1. 定义数组格式:
  • 元素类型 数组名称[元素个数];
int arr[2]; // 定义int 类型的数组 arr

数组的初始化
1. 定义的同时初始化 (完全初始化)
int ages[4] = {1, 3, 5, 7};

  • 注意点:如果定义的同时初始化, 并且没有指定元素的个数, 那么元素的个数就是初始化*的个数
  • 如果只进行了部分初始化, 那么没有被初始化的元素会赋值为0
  1. 先定义再初始化
  • 注意点:
  • 如果定义的同时不初始化, 那么元素的个数不能省略
  • 2.如果先定义再初始化, 那么就不能一次性初始化,逐个初始化
【C语言|C语言 内存分析 数组知识点整理】先定义再初始化(部分初始会)
  • 如果只进行了部分初始化, 那么没有被初始化的元素不会赋值为0
遍历数组
  • 概念
    遍历数组就是取出数组中存储的所有数据, 我们就称之为遍历数组
//这是遍历数族的函数 void printArray(int arr[],int length){ for(int i=1; i

注意点
  • 在遍历数组的时候, 循环结束的条件不要写死
  • 规律: sizeof(数组名称) 可以得到该数组占用的内存总大小
printf("sizeof(arr) = %i\n", sizeof(arr));

  • 规律: sizeof(数组元素) 可以得到该元素占用的内存大小,从而计算数组的长度
  • 数组占用的内存 / 单个元素占用的内存 = 数组的长度(length.arr)
printf( " sizeof(arr[1]) = %i\n",sizeof(arr[1])); printf( " length = %i\n",sizeof(arr)/sizeof(arr[1]));

    推荐阅读