1、数据类型是固定内存块大小的别名,也就是说申明变量为一种数据类型就是告诉编译器分配多少内存给我。
看这么一段代码:
#include"stdio.h"
#include"stdlib.h"
int main() {
int a[10]; //告诉编译器分配40个字节
printf("a : %d, a + 1 : %d, &a : %d, &a + 1 : %d\n", a, a + 1, &a, &a + 1);
system("pause");
return 0;
}
输出结果:
可以看到a与&a是一样的,都是a的首地址,a + 1与 &a + 1不一样,a + 1相比a进了4字节,&a + 1相比&a进了40个字节。
也就是说a和&a的数据类型是不一样的,a代表数组a的首地址,&a代表整个数组的地址。
2、数据类型别名
通过typedef是可以对数据起别名的:
#include"stdio.h"
#include"stdlib.h"
struct Teacher {
char name[128];
int age;
};
int main() {
struct Teacher t;
system("pause");
return 0;
}
在C语言中,对于结构体,如果写成上面的形式,是不能直接使用Teacher作为数据类型的,必须使用struct Teacher(这在C++中优化了,可以直接使用Teacher作为数据类型)。
把上面的代码改一下:
#include"stdio.h"
#include"stdlib.h"
typedef struct Teacher {
char name[128];
int age;
}Teacher;
int main() {
Teacher t;
system("pause");
return 0;
}
这就用typedef就是给struct Teacher起了一个别名叫Teacher,所以这里就可以使用Teacher作为数据类型了。
3、void数据类型
void类型表示任何数据类型,void*可以指向任何类型的地址;
注意:
1> 不存在void的变量,因为void类型表示任何的数据类型,那编译器就不知道该如何分配内存了。
2> void类型主要用来封装数据类型,让调用接口的用户不知道参数的数据类型是什么。
例如malloc的返回类型就是void*:
char *p = (char*)malloc(100);
memcpy函数的参数也是void* 类型的
memcpy(void* buf, void const * input, int buflen);
4、思考
(1)如何表达数组的数据类型?
(2)函数可以看成是数据类型吗?
(3)如何对函数重定义?