C语言数据类型

  • Post author:
  • Post category:其他


一、数据类型分类

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、少用全局变量,提高程序可读性和可移植性,便于函数的模块化设计

变量的字节长度根据定义变量类型的不同而不同

定义和声明的区别

定义就分配变量,不可多次定义,声明不分配内部空间,可多次声明

声明可以多次,不分配内存,声明可以加快编译速度



版权声明:本文为m0_57105760原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。