数据类型
文章目录
引言:
计算机是人类用来解决问题的工具---->计算机如何来解决问题?------>计算
计算需要数据, 我们想让这个数据去运算----->那么我们首先要考虑的问题是------>如何将这个数据保存起来
保存的位置在哪里 -> 内存------>所以操作内存实际上就是为了操作数据
由于内存是有大小的 ,不可能给你一个数据开无限的空间------->所以需要一个机制来控制你这个数据开多少空间
----------->这个东西就是数据类型
由此可知:数据类型实际上就是数据的属性
一、c语言里面的数据类型
基本类型:
c语言给你定义好了的你直接用就可以了
(signed) int/unsigned int 整型 分配4个字节 signed可以省略
(signed) char/unsigned char 字符型 分配1个字节
(signed) short/unsigned short 短整型 分配2个字节
(signed) long/unsigned long 长整型 分配4个字节
(signed) long long/unsigned long long 长长整形 分配8个字节
浮点型(小数)
float 单精度 分配4多个字节
double 双精度(默认) 分配8个字节
注:
在32位里面 :int和long都是4个字节,没有任何区别 ,long long是8个字节
在64位里面: long是8个字节, long long 也是8个字节
构造类型:
程序员自己定义的类型
如:数组、结构体、联合体、枚举
指针类型: *
int * p // int类型的指针,指向整型数据,读取4个字节的数据
char * p // char类型的指针,指向字符型数据,读取1个字节的数据
空类型 : void
1 用作函数的返回值 表示这个函数没有返回值
void function()
{
return;
}
2 用在函数的参数位置 表示这个函数没有参数
void function(void)
{
return;
}
在新一点的编译器里面 这个参数位置的void是可以省略的
3 void * -> 指针的最高境界 通用指针
只要你是一个指针 就可以接受
相关链接:https://blog.csdn.net/walle2018/article/details/80359972?spm=1001.2014.3001.5506
二、字符型与整型数据(重点)
注意计算机里面只能运行数据(数字) 没有图形的概念
我们要保存图形怎么办 -> 只能用一个数字去代表一个图形
A -> 65
在c语言里面 字符是用’'引起来的
char sb = ‘A’;
if(‘A’ == 65) //是真的
char sb = 65;
三、常量与变量
常量:程序在运行的过程中间,不能改变它的值的这些东西 我们就叫常量
常量在c语言里面有很多种
1.整型常量
一个整数 你不能改变这个整数的意义 因此这个整数是不变的
常量是放在一个叫只读存储区的一个东西里面
只能读不能写
整数的表示方法有:
十进制整数
八进制整数 : 一个数代表的是3个bit
十六进制 整数:一个数代表的是4个bit
底层在实现的时候都是以字节为单位, 因此,我们表示这个字节用16进制会非常的方便
拓展:
rwx -> 我们可以用这个8进制的一个数来表示权限
r 读权限,w 写权限,x 执行权限
八进制 二进制
0 000
1 001
2 010
3 011
4 100
5 101
6 110
7 111
chmod u + x 给所有者(u)添加执行权限,详情链接如下:
https://blog.csdn.net/weixin_40744265/article/details/95202412?spm=1001.2014.3001.5506
2. 字符常量
实际就是一个字符
字符在计算机里面不是保存的它的形状
它保存的是一个整数 -> 代表了某一个形状
ASCII码 -> man ASCII
man -> 查看函数手册
字符的存储位置:
char a = ‘A’ ------> 它会放在一个只读存储区里面
char * s = ‘A’; —>s指向的是一个只读存储区
ASCII 说明:
是美国对于信息交换的标准代码。它是7位码。 许多8位码(比如 ISO
8859-1, Linux 的默认字符集)容纳 ASCII 作为它们的下半部分。对应的国际
ASCII 是 ISO 646。
3.字符串常量:
字符是一个常量 那么字符串也是一个常量
字符串结尾:
‘\0’ -> 0 计算机里面 字符串的结尾必须是 \0
strlen ->遇到第一个\0就结束
char a = ‘\0’; // char a = 0;
char * s = “penglei”; ->这个字符串的长度是7 但是它所占的空间为8个字节,最后有一个\0
字符与字符串的写法区分:
‘’ -> 字符
“” -> 字符串
字符串的存储位置:
“penglei” ------> 它也会放在一个只读存储区里面
char * s = “penglei”; —>s指向的是一个只读存储区
char c = *s; //可以,只读,没有改变s指向只读存储区的值
*s = ‘A’; //不可以,只读不可写,s指向的是只读存储区,不允许被写入新的值
char c = s[1]; //可以,只读
s++; //可以,指针向后移了一位,只读存储区的值未受到改变
char s1[] = “penglei”; -> 数组名放在栈内存,数组元素放在堆内存
*s1 = ‘A’; //可以,堆内存的值可以被重新写入
s1++; //不可以,s1指向的是数组首地址,数组首地址不能被改变
四、内存分配:
一个程序在运行的时候 操作系统会给这个程序分配一个8M的空间
这8M里面又划分了很多块
.text -> 只读存储段 存放代码(指令)
.bss -> 可读可写 没有初始化的全局变量和static变量会放此
.data -> 可读可写 以初始化的全局变量和static变量会放在此
.rodata -> 只读存储段 只能存放只读的数据
栈空间 -> 可读可写 存放局部变量 出来局部就会被释放
局部变量->在大括号里面的就是局部
全局变量->在大括号外面的
堆空间 -> 动态内存分配
这个空间一个显著的特点---->就是用完不会释放
我们需要手动free
它可以向系统要内存