c语言基础第14节《指针》

发布于:2025-03-02 ⋅ 阅读:(87) ⋅ 点赞:(0)

C语言指针知识总结

目录

  1. 指针的概念
  2. 指针的声明与初始化
  3. 指针的操作
  4. 指针的高级用法
  5. 指针与动态内存分配
  6. 指针的常见错误与注意事项

指针的概念

指针是C语言中一种非常重要的数据类型,它存储的是变量的内存地址。通过指针,可以直接访问和操作内存中的数据,这使得C语言在底层编程中非常强大。

  • 指针的本质:指针是一个变量,其值为另一个变量的内存地址。
  • 指针的作用
    • 直接访问内存地址。
    • 实现动态内存分配。
    • 提高函数参数传递的效率。
    • 支持复杂的数据结构(如链表、树等)。

指针的声明与初始化

指针的声明

指针的声明需要指定指针所指向的数据类型,语法如下:

数据类型 *指针变量名;

例如:

int *p;  // 声明一个指向int类型的指针

指针的初始化

指针在使用前必须初始化,否则会指向一个未知的内存地址,可能导致程序崩溃。指针可以通过以下方式初始化:

  1. 指向一个已存在的变量:
    int a = 10;
    int *p = &a;  // p指向变量a的地址
    
  2. 初始化为NULL(空指针):
    int *p = NULL;  // p为空指针,不指向任何有效地址
    

指针的操作

取地址与解引用

  • 取地址运算符&:获取变量的内存地址。
    int a = 10;
    int *p = &a;  // p存储a的地址
    
  • 解引用运算符*:通过指针访问或修改指向的内存数据。
    int a = 10;
    int *p = &a;
    *p = 20;  // 通过p修改a的值为20
    printf("%d", a);  // 输出20
    

指针的算术运算

指针的算术运算主要包括:

  • 指针加减整数:指针会根据指向的数据类型调整地址。
    int arr[3] = {10, 20, 30};
    int *p = arr;  // p指向arr[0]
    p++;           // p现在指向arr[1]
    printf("%d", *p);  // 输出20
    
  • 指针相减:计算两个指针之间的元素个数。
    int arr[3] = {10, 20, 30};
    int *p1 = &arr[0];
    int *p2 = &arr[2];
    printf("%ld", p2 - p1);  // 输出2
    

指针与数组

数组名本质上是一个指向数组首元素的指针。

  • 通过指针访问数组元素:
    int arr[3] = {10, 20, 30};
    int *p = arr;
    for (int i = 0; i < 3; i++) {
        printf("%d ", *(p + i));  // 输出10 20 30
    }
    
  • 数组名与指针的区别:
    • 数组名是常量指针,不能修改其值。
    • 指针是变量,可以指向不同的地址。

指针的高级用法

指针数组与数组指针

  • 指针数组:数组中的每个元素都是指针。
    int a = 10, b = 20, c = 30;
    int *arr[3] = {&a, &b, &c};  // 指针数组
    for (int i = 0; i < 3; i++) {
        printf("%d ", *arr[i]);  // 输出10 20 30
    }
    
  • 数组指针:指向数组的指针。
    int arr[3] = {10, 20, 30};
    int (*p)[3] = &arr;  // p指向一个包含3个int元素的数组
    printf("%d", (*p)[1]);  // 输出20
    

多级指针

多级指针是指指向指针的指针。

  • 二级指针:
    int a = 10;
    int *p = &a;
    int **pp = &p;  // pp指向p
    printf("%d", **pp);  // 输出10
    

函数指针

函数指针是指向函数的指针,可以用于回调函数等场景。

  • 声明与使用:
    int add(int a, int b) {
        return a + b;
    }
    int (*func_ptr)(int, int) = add;  // 函数指针
    printf("%d", func_ptr(3, 4));  // 输出7
    

指针与动态内存分配

C语言通过指针实现动态内存分配,常用的函数有malloccallocreallocfree

  • 使用malloc分配内存:
    int *p = (int *)malloc(5 * sizeof(int));  // 分配5个int大小的内存
    if (p == NULL) {
        printf("内存分配失败");
        return 1;
    }
    free(p);  // 释放内存
    
  • 使用calloc分配并初始化内存:
    int *p = (int *)calloc(5, sizeof(int));  // 分配并初始化为0
    free(p);
    

指针的常见错误与注意事项

  1. 未初始化的指针:使用未初始化的指针会导致未定义行为。
    int *p;  // 未初始化
    *p = 10; // 错误
    
  2. 野指针:指针指向的内存已被释放。
    int *p = (int *)malloc(sizeof(int));
    free(p);
    *p = 10; // 错误
    
  3. 内存泄漏:分配的内存未释放。
    int *p = (int *)malloc(sizeof(int));
    // 忘记free(p)
    
  4. 指针类型不匹配:指针类型与指向的数据类型不匹配。
    int a = 10;
    float *p = (float *)&a;  // 不推荐
    

以上是关于C语言指针的详细知识总结,涵盖了指针的基本概念、操作、高级用法以及常见错误。希望对你有所帮助!


网站公告

今日签到

点亮在社区的每一天
去签到