C语言基础之数据类型

目录

1.常量与变量

2.基本数据类型

3.枚举类型

4.指针类型

5.数组类型

6.结构体类型

7.联合类型

8.void类型


C语言的数据类型包括以下几种:

  1. 基本数据类型:int、float、double、char、short、long、bool等。

  2. 枚举类型:enum,用于定义一组常量。

  3. 指针类型:用于存储指向内存地址的值。

  4. 数组类型:用于存储同一类型的多个元素。

  5. 结构体类型:用于定义自定义的数据类型,由多个不同的数据类型组成。

  6. 联合类型:类似于结构体,不同之处在于联合体中的所有成员变量共享同一块内存空间。

  7. void类型:一种不完整类型,表示“没有类型”或“不确定类型”。

在C语言中,每种数据类型都有其特定的大小和范围。理解和掌握C语言的数据类型是编写高效、安全、可靠程序的关键。

1.常量与变量

在计算机科学和编程中,常量和变量是非常基础和重要的概念。常量和变量都是用于存储数据的。

常量是指在程序运行过程中不会发生变化的数据量。常量可以分为文字常量(字符串、字符常量等)和数值常量(整数、浮点数等)两种。常量的值不能被修改,通常用于保存不变的数值或字符串。

变量是指在程序运行过程中可以发生变化的数据量。变量通常用于在程序执行期间存储和更新数据。在使用变量时,需要先给其分配内存空间,然后在程序中进行读取和更新。

在C语言中,定义常量可以使用关键字const,例如:

const int MAX_NUM = 100;
const float PI = 3.14;

这里的MAX_NUMPI都是常量,值不可修改。

变量可以通过定义类型和名称来声明。例如:

int age = 20;
float price = 29.99;
char grade = 'A';

数据类型 + 变量名= 变量值

内存描述符+访问这块空间+修改这个空间存储的内容。

变量声明定义:为变量分配一块内存空间。

①.声明变量,在编译期间完成

②.为变量分配内存空间

全局变量/静态变量:已定义未初始化的,编译链接到bss段,没有分配空间;已初始化的,编译时链接到data段,分配内存空间。

局部变量:在代码运行期间分配内存空间。

这里的agepricegrade都是变量,可以在程序运行过程中进行修改。C语言支持多种数据类型的变量,如整型、浮点型、字符型等。

2.基本数据类型

C语言的基本数据类型包括以下几种:

  1. int类型:整数类型,一般占据4个字节,可表示范围为-2147483648到2147483647之间的整数。

  2. char类型:字符类型,一般占据1个字节,可表示ASCII码中的所有字符。

  3. float类型:单精度浮点数类型,一般占据4个字节,可表示小数部分6位有效数字。

  4. double类型:双精度浮点数类型,一般占据8个字节,可表示小数部分15位有效数字。

  5. short类型:短整数类型,一般占据2个字节,可表示范围为-32768到32767之间的整数。

  6. long类型:长整数类型,一般占据4个字节或8个字节,可表示范围为-2147483648到2147483647之间的整数或-9223372036854775808到9223372036854775807之间的整数。

  7. bool类型:布尔类型,占据1个字节,可表示0或1。

以上是C语言的基本数据类型,每种数据类型都有其特定的大小和范围。在编写程序时,需要根据实际情况选择合适的数据类型,避免内存浪费和溢出等问题。

3.枚举类型

C语言中的枚举类型是一种用户自定义类型,它用于定义一组取值范围有限的常量。枚举类型在程序中可作为一种独立的数据类型使用。在C语言中,枚举类型采用enum关键字来定义。其语法格式为:

enum 枚举类型名 {
    枚举值1 = 常量表达式1,
    枚举值2 = 常量表达式2,
    ...
};

其中,枚举值1、枚举值2等是枚举值的名称,常量表达式1、常量表达式2等是它们对应的值。

例如,定义一个枚举类型表示颜色,可以这样写:

enum Color {
    RED = 1,
    GREEN = 2,
    BLUE = 3
};

这个定义表示,Color类型有三个枚举值,分别为RED、GREEN和BLUE,它们的值分别为1、2、3。在程序中,可以使用这些枚举值来表示颜色:

enum Color c = RED;
printf("The value of c is %d\n", c);  // 输出1

枚举类型还可以通过省略枚举值的赋值来自动递增,例如:

enum Weekday {
    MON, TUE, WED, THU, FRI, SAT, SUN
};

这个定义表示,Weekday类型有七个枚举值,分别为MON、TUE、WED、THU、FRI、SAT、SUN,它们的值分别为0、1、2、3、4、5、6。这样,程序中就可以使用这些枚举值来表示星期几:

enum Weekday today = TUE;
printf("Today is %d\n", today);  // 输出1

4.指针类型

C语言中的指针是一种特殊的数据类型,它存储了一个变量或者内存地址的地址。通过指针,程序可以直接访问内存中的数据,这使得指针成为C语言中非常重要的数据类型之一。

指针类型的定义方式为:类型名 * 指针变量名。其中,类型名表示指针所指向的变量类型,*表示指针类型,指针变量名表示指针变量的名称。

例如,定义一个指向整数类型的指针变量如下所示:

int * p;

这个定义表示,p是一个指向int类型的指针变量。在程序中,可以通过p来访问内存中存储的整数:

int a = 10;
p = &a;   // 将p指向a的地址
printf("The value of a is %d\n", *p);   // 输出a的值,即10

在上面的程序中,&运算符用于获取变量a在内存中的地址,并将该地址存储到指针变量p中。在输出a的值的时候,需要通过*运算符来访问p所指向的内存中的数据。

除了基本数据类型的指针外,C语言还支持void类型的指针,它可以指向任意类型的数据。例如,定义一个指向void类型的指针如下所示:

void * ptr;

这个定义表示,ptr是一个指向任意类型的指针变量。在程序中,可以将任意类型的指针赋值给ptr,并通过强制类型转换来访问其所指向的数据:

int a = 10;
ptr = &a;
printf("The value of a is %d\n", *((int *) ptr));   // 输出a的值,即10

在上面的程序中,将变量a的地址赋值给指针变量ptr,并通过(int *)进行强制类型转换,使得ptr指向的数据类型为int类型。在输出a的值的时候,同样需要通过*运算符来访问ptr所指向的内存中的数据。

5.数组类型

C语言中的数组是一种存储相同类型数据的数据结构,可以在程序中声明、初始化和使用。在声明数组时,需要指定数组的数据类型、数组名称和数组大小。数组大小可以是一个常量或变量,且不能在运行时改变。

数组类型的定义方式为:类型名 数组名[数组大小]。其中,类型名表示数组中元素的数据类型,数组名表示数组变量的名称,数组大小表示数组中元素的数量。

例如,定义一个整数类型的数组变量如下所示:

int numbers[5];   // 定义一个包含5个整数的数组

这个定义表示,numbers是一个包含5个整数的数组。在程序中,可以通过下标访问数组中的元素:

numbers[0] = 1;   // 给数组第一个元素赋值为1
numbers[1] = 2;   // 给数组第二个元素赋值为2
printf("The first element of array is %d\n", numbers[0]);   // 输出数组第一个元素的值,即1

在上面的程序中,使用数组下标来访问数组中的元素,下标从0开始,每次加1表示访问下一个元素。

除了一维数组外,C语言还支持多维数组,它是由多个一维数组组成的。例如,定义一个两行三列的整数类型的二维数组如下所示:

int matrix[2][3];   // 定义一个包含2行3列的整数类型的二维数组

这个定义表示,matrix是一个包含2行3列的整数类型的二维数组。在程序中,可以通过两个下标来访问数组中的元素:

matrix[0][0] = 1;   // 给数组第一个元素赋值为1
matrix[1][2] = 3;   // 给数组最后一个元素赋值为3
printf("The second row, third column element of matrix is %d\n", matrix[1][2]);   // 输出数组第二行第三列的元素的值,即3

在上面的程序中,使用两个下标来访问二维数组中的元素,第一个下标表示行数,第二个下标表示列数。

6.结构体类型

C语言的结构体类型是一种自定义的数据类型,可以将不同类型的数据组合在一起,形成一个逻辑上的整体。

结构体类型的定义通常包含以下部分:

  1. 结构体名称:用于定义结构体类型的名称。

  2. 成员列表:结构体类型由多个成员组成,每个成员描述了结构体内的一个数据项,包括数据类型和名称。

  3. 结构体变量:定义结构体类型后,可以通过定义结构体变量来创建一个实际的结构体对象。

下面是一个简单的结构体类型的定义示例:

struct Person {
    char name[20];
    int age;
    float height;
};

int main() {
    // 创建一个Person类型的结构体变量
    struct Person p1 = {"Tom", 20, 1.8};
    // 访问结构体成员
    printf("Name: %s, Age: %d, Height: %.2f\n", p1.name, p1.age, p1.height);
    return 0;
}

在上面的示例中,定义了一个名为Person的结构体类型,包含3个成员:name、age、height。然后在main函数中,通过定义p1变量创建了一个实际的Person结构体对象,并初始化了成员的值。最后通过访问结构体成员的方式输出了结构体变量的值。

7.联合类型

C语言的联合类型是一种数据类型,也称为共用体。与结构体类型类似,联合类型由多个成员组成,不同的是这些成员共享同一块内存空间,只能同时存储其中的一个成员。联合类型的定义通常包含以下部分:

  1. 联合体名称:用于定义联合体类型的名称。

  2. 成员列表:联合体类型由多个成员组成,每个成员描述了联合体内的一个数据项,包括数据类型和名称。

  3. 联合体变量:定义联合体类型后,可以通过定义联合体变量来创建一个实际的联合体对象。

下面是一个简单的联合体类型的定义示例:

union Data {
    int i;
    float f;
    char str[20];
};

int main() {
    // 创建一个Data类型的联合体变量
    union Data data;
    
    // 赋值并访问联合体成员
    data.i = 10;
    printf("data.i: %d\n", data.i);
    
    data.f = 3.14;
    printf("data.f: %.2f\n", data.f);
    
    strcpy(data.str, "hello");
    printf("data.str: %s\n", data.str);
    
    return 0;
}

在上面的示例中,定义了一个名为Data的联合体类型,包含3个成员:i、f、str。这些成员共享同一块内存空间,只能同时存储其中的一个成员。然后在main函数中,通过定义data变量创建了一个实际的Data联合体对象,并分别赋值访问了联合体成员。需要注意的是,对于联合体变量的任何一次赋值操作,都会导致其它成员的值被覆盖。

8.void类型

C语言中的void类型实际上是一种表示无类型的特殊类型。void类型在函数声明、定义和指针等场景中经常使用。

  1. 函数声明:void类型可以用于函数的返回值类型,表示此函数不返回任何值。例如:
void sayHello(void); // 声明一个不返回值的函数

  1. 函数定义:void类型同样可以用于函数的返回值类型,表示此函数不返回任何值。例如:
void sayHello(void) {
    printf("Hello!\n");
}

  1. 指针:void类型指针可以指向任意类型的空间,但是不能进行解引用操作,需要先进行类型转换。例如:
int a = 10;
float b = 3.14;

void *p; // 声明一个void类型指针

p = &a; // 指向a
printf("%d\n", *(int *)p); // 需要先进行类型转换

p = &b; // 指向b
printf("%.2f\n", *(float *)p); // 需要先进行类型转换

需要注意的是,由于void类型是一种无类型的类型,因此在声明变量时不能使用void类型。例如以下代码将会产生编译错误:

void x; // 错误:无法定义void类型的变量

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

茶包不是trouble

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值