【快速上手C语言】第七章:指针——深入理解C语言的核心概念

        指针是C语言中一个强大且灵活的工具,它允许程序直接访问和操作内存地址。理解指针及其用法对编写高效和灵活的C语言程序至关重要。

指针的基本概念与操作

        指针是一个变量,用于存储另一个变量的内存地址。指针的基本操作包括声明、赋值和解引用。

        指针的声明与赋值:使用*声明指针变量,并通过&操作符获取变量的地址。

#include <stdio.h>

int main() {
    int a = 10;
    int *p;  // 声明一个指向int类型的指针变量p
    p = &a;  // 将a的地址赋值给指针p

    printf("a 的值: %d\n", a);
    printf("p 指向的地址: %p\n", p);
    printf("p 指向的值: %d\n", *p);  // 解引用,获取p指向的值

    return 0;
}
// 运行结果:
// a 的值: 10
// p 指向的地址: 0x... (具体地址值因系统而异)
// p 指向的值: 10

指针的解引用:通过解引用操作符*,可以访问指针所指向的内存地址上的值。

#include <stdio.h>

int main() {
    int a = 20;
    int *p = &a;

    *p = 30;  // 修改指针指向地址上的值

    printf("修改后的a的值: %d\n", a);

    return 0;
}
// 运行结果:
// 修改后的a的值: 30

        在上面的例子中,指针p指向变量a的地址,通过解引用操作*p = 30;直接修改了a的值。

指针与数组

        数组名本身就是一个指针,它指向数组的第一个元素。通过指针,可以方便地遍历数组或传递数组到函数中。

#include <stdio.h>

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    int *p = arr;  // 数组名本身是一个指针,指向第一个元素

    for (int i = 0; i < 5; i++) {
        printf("arr[%d] = %d, *(p + %d) = %d\n", i, arr[i], i, *(p + i));
    }

    return 0;
}
// 运行结果:
// arr[0] = 1, *(p + 0) = 1
// arr[1] = 2, *(p + 1) = 2
// arr[2] = 3, *(p + 2) = 3
// arr[3] = 4, *(p + 3) = 4
// arr[4] = 5, *(p + 4) = 5

        在这个例子中,通过指针p遍历数组元素,与直接通过数组名访问元素的效果相同。

指针与函数

        指针可以作为函数的参数,用于传递数组或引用(通过指针传递),从而在函数内部直接修改外部变量的值。

通过指针传递数组

#include <stdio.h>

void printArray(int *arr, int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", *(arr + i));
    }
    printf("\n");
}

int main() {
    int arr[5] = {10, 20, 30, 40, 50};
    printArray(arr, 5);  // 传递数组的指针

    return 0;
}
// 运行结果:
// 10 20 30 40 50

通过指针修改变量

#include <stdio.h>

void modifyValue(int *p) {
    *p = 100;  // 修改指针指向的值
}

int main() {
    int a = 50;
    modifyValue(&a);  // 传递变量的地址

    printf("修改后的a的值: %d\n", a);

    return 0;
}
// 运行结果:
// 修改后的a的值: 100

        通过指针作为函数参数,函数内部可以直接修改外部变量的值。

指针的高级用法:指针的指针、函数指针

        指针的指针:指针的指针(double pointer)是指向另一个指针的指针,通常用于动态分配二维数组或在函数中返回指针。

#include <stdio.h>

int main() {
    int a = 10;
    int *p = &a;  // 指向a的指针
    int **pp = &p;  // 指向p的指针

    printf("a 的值: %d\n", a);
    printf("通过一级指针访问a的值: %d\n", *p);
    printf("通过二级指针访问a的值: %d\n", **pp);

    return 0;
}
// 运行结果:
// a 的值: 10
// 通过一级指针访问a的值: 10
// 通过二级指针访问a的值: 10

函数指针:函数指针用于指向函数,可以在运行时动态调用不同的函数。函数指针通常用于回调函数或实现策略模式。

#include <stdio.h>

int add(int a, int b) {
    return a + b;
}

int multiply(int a, int b) {
    return a * b;
}

int main() {
    int (*operation)(int, int);  // 声明函数指针

    operation = &add;  // 指向add函数
    printf("5 + 3 = %d\n", operation(5, 3));  // 调用add函数

    operation = &multiply;  // 指向multiply函数
    printf("5 * 3 = %d\n", operation(5, 3));  // 调用multiply函数

    return 0;
}
// 运行结果:
// 5 + 3 = 8
// 5 * 3 = 15

        在这个例子中,operation是一个函数指针,它可以指向addmultiply函数,并通过指针调用对应的函数。

总结:

        本章介绍了C语言中指针的基本概念与操作、指针与数组的关系、指针在函数中的应用,以及指针的高级用法(指针的指针和函数指针)。通过掌握这些知识,你可以编写出更加灵活和高效的C语言程序。在下一章中,我们将进一步探讨结构体和联合体的使用,以支持更复杂的数据操作和存储。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值