C语言课程4-高级特性

4. 高级特性

4.1 函数

  • 4.1.1 函数的定义与声明
  • 4.1.2 函数调用
  • 4.1.3 参数传递
    • 4.1.3.1 值传递
    • 4.1.3.2 引用传递(通过指针)
  • 4.1.4 返回值
    • 4.1.4.1 返回基本数据类型
    • 4.1.4.2 返回指针
    • 4.1.4.3 返回结构体

4.2 指针

  • 4.2.1 指针的基础概念
  • 4.2.2 指针与变量地址
  • 4.2.3 指针的解引用
  • 4.2.4 指针与数组
  • 4.2.5 指针与字符串
  • 4.2.6 函数指针
  • 4.2.7 指针的运算

4.3 数组与字符串

  • 4.3.1 数组的基础概念
  • 4.3.2 一维数组的初始化与访问
  • 4.3.3 多维数组
  • 4.3.4 字符串与字符数组
  • 4.3.5 字符串操作函数
  • 4.3.6 数组与指针的关系

4.4 结构体

  • 4.4.1 结构体的定义与声明
  • 4.4.2 结构体的初始化与访问
  • 4.4.3 结构体数组
  • 4.4.4 结构体指针与动态内存分配
  • 4.4.5 嵌套结构体与联合体
  • 4.4.6 结构体与函数

4.5 结论

 

4. 高级特性

        C 语言的高级特性包括函数、指针、数组、字符串和结构体。这些特性为程序的复杂数据处理和灵活控制提供了基础,能有效提高代码的复用性、可维护性和效率。以下是这些特性的详细介绍。


4.1 函数

        函数是将一段代码封装为一个单独的模块,便于复用和调用。通过函数,程序可以简化复杂操作,增强结构化编程的能力。

4.1.1 函数的定义与声明

        函数定义是指给出函数的实际实现,包括返回类型、函数名、参数列表和函数体。函数声明是告诉编译器函数的名称、返回类型和参数类型,以便在函数调用之前能够正确识别它。

语法

返回类型 函数名(参数列表) {
    // 函数体
}

示例

// 函数声明
int add(int a, int b);

// 函数定义
int add(int a, int b) {
    return a + b;
}

在此示例中,add 函数接受两个 int 类型的参数,并返回两者的和。

4.1.2 函数调用

        函数调用时,将实际参数传递给函数的参数列表,函数执行其代码并返回结果(如果有返回值)。调用时,函数名后面紧跟括号及参数。

示例

int result = add(5, 3); // 调用函数并将结果赋值给 result
4.1.3 参数传递

        C 语言中的函数参数传递有两种方式:值传递引用传递(通过指针)。每种方式对函数如何操作参数有所不同。

4.1.3.1 值传递

        值传递是将参数的副本传递给函数,因此函数内部的修改不会影响原始变量。此方式适用于不需要在函数内修改实参的情况。

示例

void increment(int x) {
    x++; // 仅仅修改副本,原始变量不变
}

在这个例子中,x 的值在函数内被增加,但不会影响调用者的 x

4.1.3.2 引用传递(通过指针)

        通过指针传递参数时,函数接收的是变量的地址,而非值本身。这样,函数可以直接修改原始变量。

示例

void increment(int *x) {
    (*x)++; // 修改指向的实际值
}

 在这个例子中,通过指针传递,函数能直接修改调用者的变量。

4.1.4 返回值

        函数可以返回计算结果。返回类型可以是基本数据类型、指针、结构体等。返回值通过 return 关键字返回给调用者。

4.1.4.1 返回基本数据类型

        通常,函数返回整数、浮点数或其他简单类型的值。

示例

int multiply(int a, int b) {
    return a * b;
}
4.1.4.2 返回指针

        返回指针时,函数可以返回数组、结构体或者动态分配的内存地址。返回指针的函数可以实现更复杂的功能,比如动态内存管理。

示例

int* getPointer(int *a) {
    return a; // 返回指针
}

返回的指针可以在调用者中继续操作。

4.1.4.3 返回结构体

        函数也可以返回复杂的数据结构,例如结构体。这通常用于返回多个数据成员的组合结果。

示例

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

struct Person getPerson() {
    struct Person person = {"Alice", 25};
    return person;
}

4.2 指针

        指针是 C 语言中强大的特性之一,它存储的是另一个变量的内存地址。通过指针,可以间接访问和修改内存中的数据,从而实现灵活的数据操作。

4.2.1 指针的基础概念

        指针是专门用来存储变量地址的变量。它可以指向任何数据类型,并通过解引用运算符 * 访问指针指向的实际值。

语法

int *ptr; // 定义一个指向整数的指针
4.2.2 指针与变量地址

        使用 & 运算符获取变量的内存地址,并将其赋值给指针。指针保存的是内存地址,而非实际值。

示例

int a = 10;
int *ptr = &a; // ptr 存储变量 a 的地址

ptr 存储了变量 a 的地址,此时 *ptr 可以访问 a 的值。

4.2.3 指针的解引用

        通过解引用运算符 * 访问或修改指针指向的实际值。

示例

int value = *ptr; // 通过指针访问值

解引用 ptr 可以获得 a 的值。

4.2.4 指针与数组

        数组名实际上是指向数组第一个元素的指针。因此,指针可以用于遍历数组,代替数组的下标操作。

示例

int arr[] = {1, 2, 3};
int *ptr = arr; // 数组名本质上是指针
for (int i = 0; i < 3; i++) {
    printf("%d\n", *(ptr + i)); // 使用指针访问数组
}
4.2.5 指针与字符串

        字符串是以 \0 结尾的字符数组,可以通过指针操作字符串。字符串的首地址就是字符数组的首元素地址。

示例

char str[] = "Hello";
char *ptr = str; // ptr 指向字符串的首地址
printf("%s\n", ptr); // 使用指针输出字符串
4.2.6 函数指针

        函数指针是指向函数的指针,可以动态调用函数。通过函数指针,程序可以选择在运行时调用不同的函数,从而实现动态功能。

语法

int (*funcPtr)(int, int) = add; // 定义一个函数指针
int result = funcPtr(5, 3);     // 通过函数指针调用函数

示例

int arr[] = {1, 2, 3};
int *ptr = arr;
ptr++; // 指向数组的下一个元素
printf("%d\n", *ptr); // 输出 2

4.3 数组与字符串

        数组和字符串是存储一系列相同数据类型的变量的结构。字符串是特殊的字符数组,通常以 \0 结束。

4.3.1 数组的基础概念

        数组是存储多个相同类型数据的连续内存块。通过数组,可以轻松处理大量相同类型的数据。

语法

数据类型 数组名[大小];

数组大小在声明时指定,大小一旦设定,无法更改。

4.3.2 一维数组的初始化与访问

        一维数组可以在声明时初始化。访问数组中的元素通过下标(索引)来实现。

示例

int arr[5] = {1, 2, 3, 4, 5};
int first = arr[0]; // 访问第一个元素
4.3.3 多维数组

        多维数组扩展了数组的概念,允许存储多维数据。例如,二维数组可以存储表格数据。

示例

int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
4.3.4 字符串与字符数组

        字符串是以 \0 结尾的字符数组。C 语言没有专门的字符串类型,因此使用字符数组来处理字符串。

示例

char str[] = "Hello";

字符串数组 str 实际上存储了 H, e, l, l, o, \0

4.3.5 字符串操作函数

        C 标准库提供了许多操作字符串的函数,如 strlen() 获取字符串长度,strcpy() 复制字符串,strcat() 拼接字符串等。

示例

char dest[20];
strcpy(dest, "Hello"); // 复制字符串到 dest
4.3.6 数组与指针的关系

        数组名本质上是指向数组首元素的指针,因此数组可以用指针来操作和遍历。

示例

int arr[] = {1, 2, 3};
int *ptr = arr; // 指针指向数组首地址

4.4 结构体

        结构体是将不同类型的数据组合在一起的一种复合数据类型,用于组织复杂的数据。通过结构体,可以将相关联的数据组合在一起进行操作。

4.4.1 结构体的定义与声明

        结构体是由多个不同类型的成员组成的复合数据类型。定义时需指定每个成员的类型和名称。

语法

struct 结构体名 {
    数据类型 成员1;
    数据类型 成员2;
};
4.4.2 结构体的初始化与访问

        可以在声明结构体变量时进行初始化。通过点运算符 . 访问结构体的成员。

示例

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

struct Person person = {"Alice", 25};
printf("Name: %s, Age: %d", person.name, person.age);
4.4.3 结构体数组

        可以创建结构体数组来存储多个同类的结构体实例。结构体数组用于存储相同类型的多个对象。

示例

struct Person people[2] = {{"Alice", 25}, {"Bob", 30}};

4.4.4 结构体指针与动态内存分配

        可以通过指针操作结构体,特别是在需要动态分配内存时非常有用。使用 malloc() 等内存管理函数动态分配内存给结构体。

示例

struct Person *ptr = malloc(sizeof(struct Person)); // 动态分配内存
ptr->age = 25; // 通过指针操作成员
4.4.5 嵌套结构体与联合体

        结构体可以嵌套其他结构体,允许表示更复杂的数据结构。联合体是与结构体类似的概念,但其成员共享同一块内存。

示例

struct Date {
    int day, month, year;
};

struct Person {
    char name[20];
    struct Date birthday;
};
4.4.6 结构体与函数

结构体可以作为函数参数或返回值,用于传递和返回复杂的数据。在传递结构体时,可以使用值传递或指针传递。

示例

void printPerson(struct Person p) {
    printf("Name: %s, Age: %d", p.name, p.age);
}

4.5 结论

        通过深入理解函数、指针、数组、字符串和结构体等高级特性,程序员可以利用 C 语言灵活高效地管理数据、实现复杂的操作。函数和指针增加了代码的复用性和灵活性,数组和字符串使得批量数据的处理更加便捷,而结构体则提供了组织复杂数据的强大工具。这些特性共同构成了 C 语言编程的基础,使其能够胜任多种复杂任务。

  • 25
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值