一、数据类型分类
1、数据类型大小
2、内存大小测量
3、各种数据取值范围
4、原码和补码
5、unsigned和signed在平台上的移植问题和解决方法
6、defind和typedef区别
二、变量与常量
变量的三大特点:字节长度、生命周期&作用域、存储空间
三、常见面试题
一、数据类型分类
1、数据类型大小(不同编译器上数据类型的大小不同)
例题:
#include <stdio.h>
#include <string.h>
int main()
{
char num = 5;
//unsigned long len = sizeof(num);//sizeof计算数据类型和变量的内存大小
//unsigned longlen = sizeof(int);
//sizeof是一个运算符
//unsigned long len = sizeof num; size_t
//测量所有基本数据类型的字节长度
printf(“int = %ld\n”, sizeof(int));
printf(“short = %ld\n”, sizeof(short));
printf(“long = %ld\n”, sizeof(long));
printf(“char = %ld\n”, sizeof(char));
printf(“float = %ld\n”, sizeof(float));
printf(“double = %ld\n”, sizeof(double));
//指针的长度(固定长度):int *; char *
//指针类型:保存地址,操作系统中地址的长度是固定长度,是由操作系统位数的决定的,64位系统是8个字节,32位系统是4个字节
printf(“int * = %ld\n”, sizeof(int *));
printf(“short * = %ld\n”, sizeof(short *));
printf(“long * = %ld\n”, sizeof(long *));
printf(“char * = %ld\n”, sizeof(char *));
printf(“float * = %ld\n”, sizeof(float *));
printf(“double * = %ld\n”, sizeof(double *));
//数组的长度: 数组的长度 * 元素类型的长度
int array_int[100];
char src[100] = “hello”; //char src[100] = {‘h’,’e’,’l’,’l’,’o’,’\0′};
printf(“array int = %ld\n”, sizeof(array_int));
printf(“array_char = %ld\n”, sizeof(src));
//字符串的长度: int strlen(char *src); 不统计’\0′
//”hello world”;
char *ptr = “hello world”;
printf(“sizeof(ptr) = %ld\n”, sizeof(ptr)); //测量是ptr指针变量的大小
printf(“strlen(ptr) = %ld\n”, strlen(ptr));
printf(“strlen(\”helo world\”) = %ld\n”,strlen(“hello world”));
//笔试题
char *s1 = “hello world”;
char s2[100] = “hello world”;
printf(“sizeof(s1) = %ld\n”, sizeof(s1)); //8
printf(“sizeof(s2) = %ld\n”, sizeof(s2)); //100
printf(“strlen(s1) = %ld\n”, strlen(s1)); //11
printf(“strlen(s2) = %ld\n”, strlen(s2)); //11
return 0;
}
部分运行截图
#include<stdio.h>
#include<string.h>
int main()
{
char *p = “hello”;
char arr1[]= “hello”;
char arr2[] = { ‘h’, ‘e’, ‘l’, ‘l’,’o’ };
printf(“%ld\n”, sizeof( p));
//结果4,因为指针变量的所占空间大小仅仅和操作系统位数有关32-4,64-8
printf(“%ld\n”, sizeof(arr1));
//结果6,字符串默认以\0结尾,sizeof()包含\0的计算
printf(“%ld\n”, sizeof(arr2));
//结果为5,因为为字符型表示,并不含有\0(仅仅字符串有\0)
printf(“%ld\n”, strlen( p));
//结果为5,strlen求的是字符串的长度,不包含\0
printf(“%ld\n”, strlen(arr1));
//结果为5,strlen求的是字符串的长度,不包含\0
printf(“%ld\n”, strlen(arr2));
//因为字符型不包含\0,但字符串需要找到\0才可结束,所以在’o’之后继续向后读取直到找到\0,所以是一个随机值
}
2、内存大小测量
sizeof(关键字)
格式 sizeof(变量名)不要去测字符串长度
sizeof (int) 测整型类型的长度
sizeof 变量名 测自定义变量的长度,可以不加括号
strlen 测字符串长度 strlen()测量字符串长度,要加相应的库文件#include<string.h>,不统计”\0″
指针的内存大小8字节固定,它的内存大小由操作系统的位数决定,32位 4个字节,64位 8个字节。
数字的长度 定义数组的类型*元素的个数(定以就分配内存),未定义元素个数,根据赋值元素个数的决定
3、原码和补码
为什么提出补码?
为了解决0在在其他表达上两种表达的问题
4、unsigned和signed在平台上的移植问题和解决方法
不同编译器在定义变量时默认的数据类型不同(unsigned signed)造成在其他平台编译时程序出错,占用内存,溢出等问题(内存是稀缺资源)
用关键字typedef 给数据类型重命名
格式 typedef 数据类型 自定义的名(遵循命名规则,提高可读性)
宏定义 #defind
typedef作用
1、解决移植性差的问题
2、提高代码可读性(可以把重命名的过程放在一个.h文件中)
3、简化拼写,提高代码效率
二、变量与常量
1、变量 全局变量和局部变量
C语言第一条执行的语句 全局变量
注意:
1、全局变量定义在函数之后要进行声明;全局变量的是在执行所在程序到结束,而不是全部,不执行就要进行声明,和调用函数一样
2、全局变量和局部变量在同一个作用域内,局部变量有效;
3、全局变量定义时最好直接赋值,或者在函数中赋值,不要在函数外赋值,因为函数调用时,只会执行调用的语句,对之后的语句不会顺序执行,编译会报错警告
4、少用全局变量,提高程序可读性和可移植性,便于函数的模块化设计
变量的字节长度根据定义变量类型的不同而不同
定义和声明的区别
定义就分配变量,不可多次定义,声明不分配内部空间,可多次声明
声明可以多次,不分配内存,声明可以加快编译速度