一、数据类型的概念
- 类型是对数据的抽象
- 类型是相同的数据有相同的表示形式、存储格式以及相关的操作
- 程序中使用的数据必定属于某一种数据类型
?
1、算术类型:
包括三种类型:整数类型、浮点类型,枚举型。
其中:
枚举类型:被用来定义在程序中只能赋予其一定的离散整数值的变量。
字符型char:也是整数型,所有的字符都用ASCII码表来表示。
2、void 类型:
类型说明符 void 表明没有可用的值。
3、构造类型:
包括:指针类型、数组类型、结构类型、共用体类型和函数类型(函数是一个特殊的数据类型)
数组类型和结构类型统称为聚合类型。需要注意的是:函数的类型指的是函数返回值的类型。
二、数据类型的本质
- 数据类型可以理解为创建变量的模具:是固定内存大小的别名
- 数据类型的作用:编译器预算对象份额皮的内存空间大小
- 数据类型的大小:sizeof(char);
下面看一下基本数据的占用空间的大小。
#include "stdio.h" int main(int argc, const char **argv) { printf("sizeof(char) = %d\r\n", sizeof(char)); printf("sizeof(int) = %d\r\n", sizeof(int)); printf("sizeof(short) = %d\r\n", sizeof(short)); printf("sizeof(void) = %d\r\n", sizeof(void)); printf("sizeof(float) = %d\r\n", sizeof(float)); printf("sizeof(double) = %d\r\n", sizeof(double)); printf("sizeof(long) = %d\r\n", sizeof(long)); printf("sizeof(char *) = %d\r\n", sizeof(char *)); printf("sizeof(int *) = %d\r\n", sizeof(int *)); printf("sizeof(void *) = %d\r\n", sizeof(void *)); return 0; }
在win下(win10-64位)下运行结果为:
?
在linux下(x86_64)运行结果为:
?
其中,编译的时候后面的选项-w,为不显示编译的警告
相反,-W或者-Wall会显示所有的警告
三、那么数组类型
简单的测试代码如下:
1 #include "stdio.h" 2 3 int main(int argc, const char **argv) 4 { 5 char b[10]; 6 7 printf("b = %d, b + 1 = %d, &b = %d, &b + 1 = %d\r\n", b, b + 1, &b, &b + 1); 8 9 printf("sizeof:b = %d, b + 1 = %d, &b = %d, &b + 1 = %d\r\n", sizeof(b), sizeof(b + 1), sizeof(&b), sizeof(&b + 1)); 10 11 return 0; 12 }
?
由运行结果可以看出
b和&b是一样的,是因为b是数组首元素的地址,也数组的首地址,&b意思就是对整个数组取地址,当然和b是一样的了,此时,b也是一个地址常量;
b+1:在数组首元素基础上偏移一个地址,对于程序上面的char类型数据,偏移量为1,b+1即b[1],所以结果是在b的基础上加1;
&b+1:表示在整个数组的基础上偏移1,也即是跳过整个数组,所以,&b+1的值为b+10。
综上所述:也就是本质不同,b和&b代表的数据类型不一致
b 代表的是数组收元素的地址
&b 代表的是整个数据的地址
四、数据类型起别名
1、typedef unsigned int uint16_t;
2、#define uint8_t unsigned char
关于typedef和define的具体用法,可以查看:typedef和define的简单说明
五、数据类型的封装
1、void字面意思是无类型,void *则为无类型指针,void *可以指向任何类型的数据
2、比如int func(void *handle),可以参考memcpy和memset的函数
函数原型为:
void *memcpy(void *dest, void *src, size_t count);
void *memset(void *buffer, int c, size_t num)
3、void可以修饰函数的返回值和参数,表示无返回值或者参数
如果函数没有返回值,则应该声明为void型
如果没有参数,应该声明参数为void
比如:int func(void){return 0;}
4、void指针的意义
C语言中规定只有相同类型的指针才可以相互赋值
void*指针作为左值用于接收任意类型的指针
void*作为右值赋值给其他指针是需要进行数据类型的强制转换
int p1 = NULL;
char *p2 = (char *)malloc(sizeof(char) * 20);
5、C语言中不存在void类型的变量,在C中,没有规定void是多大内存的别名
原文地址:https://www.cnblogs.com/songshuaiStudy/p/10549465.html