C - 数据类型

你好,未来的程序员们!欢迎加入我们激动人心的C编程世界之旅。今天,我们将探索C语言中迷人的数据类型领域。如果你是编程新手,不用担心;我将作为你的友好向导,我们会一步一步地解决这个问题。所以,拿起你最喜欢的饮料,舒服地坐下来,让我们一起深入研究!

C - Data Types

C语言中的整数数据类型

让我们从我们都熟悉的东西开始 - 整数。在C语言中,我们称这些为整数,它们有不同的尺寸和类型。

基本整数类型

下面是C语言中最常见的整数类型的表格:

数据类型 大小(字节) 范围
char 1 -128 到 127 或 0 到 255
short 2 -32,768 到 32,767
int 4 -2,147,483,648 到 2,147,483,647
long 4 或 8 -2,147,483,648 到 2,147,483,647 或 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807

现在,让我们看看它们的实际应用:

#include <stdio.h>

int main() {
char my_char = 65;
short my_short = 32000;
int my_int = 2000000000;
long my_long = 9000000000L;

printf("char: %c\n", my_char);
printf("short: %d\n", my_short);
printf("int: %d\n", my_int);
printf("long: %ld\n", my_long);

return 0;
}

当你运行这段代码时,你会看到:

char: A
short: 32000
int: 2000000000
long: 9000000000

让我们来分解一下:

  • char 值 65 对应于ASCII表中的 'A'。惊喜!char 也可以存储数字!
  • shortint 对于中等大小的数字来说工作如预期。
  • 对于 long,我们在末尾加上 'L' 来告诉C这是一个长数字。

无符号整数

有时,我们只需要正数。这时无符号整数就派上用场了:

unsigned char my_uchar = 255;
unsigned short my_ushort = 65000;
unsigned int my_uint = 4000000000U;

printf("unsigned char: %u\n", my_uchar);
printf("unsigned short: %u\n", my_ushort);
printf("unsigned int: %u\n", my_uint);

输出:

unsigned char: 255
unsigned short: 65000
unsigned int: 4000000000

通过使用 unsigned,我们可以在相同的内存空间中存储更大的正数。这就像魔法一样,但其实只是位操作的巧妙运用!

C语言中的浮点数据类型

现在,让我们进入小数的世界。C语言提供了三种浮点类型:

数据类型 大小(字节) 精度
float 4 6-7位小数
double 8 15-16位小数
long double 16 19-20位小数

让我们看看它们的实际应用:

#include <stdio.h>

int main() {
float pi_float = 3.14159265358979323846f;
double pi_double = 3.14159265358979323846;
long double pi_long_double = 3.14159265358979323846L;

printf("float: %.7f\n", pi_float);
printf("double: %.16f\n", pi_double);
printf("long double: %.20Lf\n", pi_long_double);

return 0;
}

输出:

float: 3.1415927
double: 3.1415926535897931
long double: 3.14159265358979323846

注意到 float 在7位数字后丢失了精度,而 doublelong double 维持了更多的准确性。这就像在数码照片上放大 - 在某个点上,你开始看到像素!

C语言中的用户定义数据类型

C语言允许我们创建自己的数据类型。就像厨师一样,创造自己的食谱!

结构体

结构体允许我们将相关的数据组合在一起:

#include <stdio.h>
#include <string.h>

struct Student {
char name[50];
int age;
float gpa;
};

int main() {
struct Student alice;
strcpy(alice.name, "Alice");
alice.age = 20;
alice.gpa = 3.8;

printf("Name: %s\n", alice.name);
printf("Age: %d\n", alice.age);
printf("GPA: %.1f\n", alice.gpa);

return 0;
}

输出:

Name: Alice
Age: 20
GPA: 3.8

在这里,我们创建了一个 Student 类型,将姓名、年龄和GPA捆绑在一起。就像为学生信息创建一个表格!

枚举

枚举非常适合创建一组命名常量:

#include <stdio.h>

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

int main() {
enum Days today = WED;
printf("Today is day number %d\n", today);
return 0;
}

输出:

Today is day number 3

枚举自动从0开始为元素分配递增的整数值。就像给数字起昵称!

C语言中的void数据类型

void 是C语言中的一个特殊类型。它就像一块空白的画布 - 它表示数据的存在。我们主要在三种情况下使用它:

  1. 函数不返回任何值:

    void sayHello() {
    printf("Hello, World!\n");
    }
  2. 函数不接受任何参数:

    int getRandomNumber(void) {
    return 4;  // 通过公平的骰子滚动得到的随机数。保证是随机的。
    }
  3. 通用指针(我们将在指针部分介绍)

C语言中的数组数据类型

数组就像一排鸽巢,每个都包含相同类型的值:

#include <stdio.h>

int main() {
int scores[5] = {85, 92, 78, 90, 88};

printf("First score: %d\n", scores[0]);
printf("Last score: %d\n", scores[4]);

float average = 0;
for(int i = 0; i < 5; i++) {
average += scores[i];
}
average /= 5;

printf("Average score: %.2f\n", average);

return 0;
}

输出:

First score: 85
Last score: 88
Average score: 86.60

记住,在C语言中,数组的索引从0开始。这就像欧洲的楼层 - 地面楼层是0!

C语言中的指针数据类型

指针就像指向内存位置的标志。它们很强大,但也可能有点棘手:

#include <stdio.h>

int main() {
int x = 10;
int *p = &x;

printf("Value of x: %d\n", x);
printf("Address of x: %p\n", (void*)&x);
printf("Value of p: %p\n", (void*)p);
printf("Value pointed by p: %d\n", *p);

*p = 20;
printf("New value of x: %d\n", x);

return 0;
}

输出(地址会有所不同):

Value of x: 10
Address of x: 0x7ffd5e8e3964
Value of p: 0x7ffd5e8e3964
Value pointed by p: 10
New value of x: 20

在这里,p 是一个指针,它存储了 x 的地址。我们可以使用 *p 来访问或修改该地址处的值。这就像对 x 有了一个遥控器!

就这样!我们已经涵盖了C语言中的主要数据类型。记住,理解数据类型对于帮助您高效管理内存和避免错误至关重要。继续练习,很快你就能像专业人士一样熟练地使用这些类型了!快乐编码!

Credits: Image by storyset