C语言数据类型与变量详解
数据类型概述
C语言中的数据类型是用于声明不同类型变量或函数的扩展系统。变量的类型决定了它在存储中占据的空间大小以及如何解释所存储的位模式。
数据类型分类
类型 | 描述 |
---|---|
基本类型 | 算术类型,分为整数类型和浮点类型 |
枚举类型 | 算术类型,用于定义只能分配某些离散整数值的变量 |
void类型 | 表示没有可用值 |
派生类型 | 包括指针类型、数组类型、结构体类型、联合类型、函数类型 |
数组类型和结构类型统称为集合类型。函数的类型指定函数返回值的类型。
整数类型
下表列出了标准整数类型的存储大小和值范围:
类型 | 容量 | 取值范围 |
---|---|---|
char | 1 byte | -128 to 127 或 0 to 255 |
unsigned char | 1 byte | 0 to 255 |
signed char | 1 byte | -128 to 127 |
int | 2 或 4 bytes | -32,768 to 32,767 或 -2,147,483,648 to 2,147,483,647 |
unsigned int | 2 或 4 bytes | 0 to 65,535 或 0 to 4,294,967,295 |
short | 2 bytes | -32,768 to 32,767 |
unsigned short | 2 bytes | 0 to 65,535 |
long | 8 bytes | -9223372036854775808 to 9223372036854775807 |
unsigned long | 8 bytes | 0 to 18446744073709551615 |
获取类型大小的示例
c
#include <stdio.h> #include <stdlib.h> #include <limits.h> #include <float.h>int main(int argc, char** argv) {printf("CHAR_BIT : %d\n", CHAR_BIT);printf("CHAR_MAX : %d\n", CHAR_MAX);printf("CHAR_MIN : %d\n", CHAR_MIN);printf("INT_MAX : %d\n", INT_MAX);printf("INT_MIN : %d\n", INT_MIN);printf("LONG_MAX : %ld\n", (long) LONG_MAX);printf("LONG_MIN : %ld\n", (long) LONG_MIN);printf("SCHAR_MAX : %d\n", SCHAR_MAX);printf("SCHAR_MIN : %d\n", SCHAR_MIN);printf("SHRT_MAX : %d\n", SHRT_MAX);printf("SHRT_MIN : %d\n", SHRT_MIN);printf("UCHAR_MAX : %d\n", UCHAR_MAX);printf("UINT_MAX : %u\n", (unsigned int) UINT_MAX);printf("ULONG_MAX : %lu\n", (unsigned long) ULONG_MAX);printf("USHRT_MAX : %d\n", (unsigned short) USHRT_MAX);return 0; }
运行结果:
text
CHAR_BIT : 8 CHAR_MAX : 127 CHAR_MIN : -128 INT_MAX : 2147483647 INT_MIN : -2147483648 LONG_MAX : 9223372036854775807 LONG_MIN : -9223372036854775808 SCHAR_MAX : 127 SCHAR_MIN : -128 SHRT_MAX : 32767 SHRT_MIN : -32768 UCHAR_MAX : 255 UINT_MAX : 4294967295 ULONG_MAX : 18446744073709551615 USHRT_MAX : 65535
浮点类型
类型 | 容量 | 取值范围 | 精度 |
---|---|---|---|
float | 4字节 | 1.2E-38 至 3.4E+38 | 小数点后6位 |
double | 8字节 | 2.3E-308 至 1.7E+308 | 小数点后15位 |
long double | 10字节 | 3.4E-4932 至 1.1E+4932 | 小数点后19位 |
浮点类型示例
c
#include <stdio.h> #include <stdlib.h> #include <limits.h> #include <float.h>int main(int argc, char** argv) {printf("Storage size for float : %d \n", sizeof(float));printf("FLT_MAX : %g\n", (float) FLT_MAX);printf("FLT_MIN : %g\n", (float) FLT_MIN);printf("-FLT_MAX : %g\n", (float) -FLT_MAX);printf("-FLT_MIN : %g\n", (float) -FLT_MIN);printf("DBL_MAX : %g\n", (double) DBL_MAX);printf("DBL_MIN : %g\n", (double) DBL_MIN);printf("-DBL_MAX : %g\n", (double) -DBL_MAX);printf("Precision value: %d\n", FLT_DIG );return 0; }
运行结果:
text
Storage size for float : 4 FLT_MAX : 3.40282e+38 FLT_MIN : 1.17549e-38 -FLT_MAX : -3.40282e+38 -FLT_MIN : -1.17549e-38 DBL_MAX : 1.79769e+308 DBL_MIN : 2.22507e-308 -DBL_MAX : -1.79769e+308 Precision value: 6
void类型
void类型表示没有可用值,在三种情况下使用:
类型 | 说明 |
---|---|
函数返回为空 | 不返回任何值的函数,返回类型为void。例如:void exit(int status); |
函数参数为void | 不接受任何参数的函数。例如:int rand(void); |
void指针 | 类型为void * 的指针表示对象的地址,但不表示其类型。例如:void *malloc(size_t size); |
变量
变量是程序可以操作的存储区域的名称。C语言中的每个变量都有特定的类型,决定了变量的内存大小、布局、可存储的值范围以及可应用的操作集合。
变量命名规则
可以由字母、数字和下划线字符组成
必须以字母或下划线开头
大写和小写字母是不同的(C语言区分大小写)
基本变量类型
类型 | 描述 |
---|---|
char | 通常是一个八位位组(一个字节),整数类型 |
int | 机器最自然的整数大小 |
float | 单精度浮点值 |
double | 双精度浮点值 |
void | 表示没有类型 |
变量定义
变量定义告诉编译器在何处以及为变量创建多少存储空间。
语法:
c
type variable_list;
有效声明示例:
c
int i, j, k; char c, ch; float f, salary; double d;
变量初始化:
c
type variable_name = value;
示例:
c
extern int d = 3, f = 5; // d和f的声明 int d = 3, f = 5; // d和f的定义和初始化 byte z = 22; // z的定义和初始化 char x = 'x'; // 变量x的值为'x'
注意: 对于没有初始化程序的定义,具有静态存储持续时间的变量隐式初始化为NULL;所有其他变量的初始值未定义。
变量声明
变量声明向编译器保证存在具有给定类型和名称的变量。
示例:
c
#include <stdio.h>// 变量声明: extern int a, b; extern int c; extern float f;int main () {/* 变量定义: */int a, b;int c;float f;/* 实际初始化 */a = 10;b = 20;c = a + b;printf("value of c : %d \n", c);f = 70.0/3.0;printf("value of f : %f \n", f);return 0; }
运行结果:
text
value of c : 30 value of f : 23.333334
函数声明示例
c
// 函数声明 int func();int main() {// 函数调用int i = func(); }// 函数定义 int func() {return 0; }
左值和右值
C语言中有两种表达式:
左值(lvalue)
引用内存位置的表达式
可能出现在赋值的左侧或右侧
变量是左值
右值(rvalue)
存储在内存中某个地址处的数据值
只能出现在赋值的右侧,不能出现在左侧
数字文字是右值
示例:
c
int g = 20; // 有效的:g是左值,20是右值 10 = 20; // 无效的:10是右值,不能出现在赋值左侧
通过理解C语言的数据类型和变量概念,程序员可以更有效地管理内存和设计程序结构,为后续学习指针、数组、结构体等复杂数据类型奠定基础。