STLG_01_09_程序设计C语言 - 指针

发布于:2025-02-10 ⋅ 阅读:(23) ⋅ 点赞:(0)

        C语言中的指针是一个非常重要的概念,它允许程序直接访问和操作内存地址。理解指针对于掌握C语言编程至关重要。

1. 指针的基本概念

  • 指针:指针是一个变量,它存储的是另一个变量的内存地址。
  • 指针变量:指针变量专门用来存储内存地址。

2. 指针的声明与初始化

2.1 指针的声明

声明一个指针变量时,需要指定它指向的变量的数据类型。声明格式如下:

数据类型 *指针变量名;

例如,声明一个指向int类型变量的指针:

int *p;
2.2 指针的初始化

指针变量可以被初始化为某个变量的地址。使用&操作符获取变量的地址。例如:

int x = 10;
int *p = &x;  // p指向x的地址

3. 指针的使用

3.1 解引用指针

使用*操作符可以访问指针所指向的内存地址中的值。例如:

int x = 10;
int *p = &x;
int y = *p;  // y的值为10

3.2 修改指针指向的值

使用*操作符可以直接修改指针所指向的内存地址中的值。例如:

int x = 10;
int *p = &x;
*p = 20;  // x的值变为20

4. 指针的算术运算

指针可以进行加减运算,以指向相邻的内存地址。例如:

int arr[5] = {10, 20, 30, 40, 50};
int *p = arr;  // p指向数组的第一个元素
p++;  // p现在指向arr[1]

5. 指针与数组

数组名本质上是一个指向数组第一个元素的指针。例如:

int arr[5] = {10, 20, 30, 40, 50};
int *p = arr;  // p指向arr[0]

6. 指针与函数

6.1 指针作为函数参数

指针可以作为函数参数,允许函数修改调用者中的变量值。例如:

void increment(int *p) {
    (*p)++;
}

int main() {
    int x = 10;
    increment(&x);  // x的值变为11
    return 0;
}
6.2 返回指针的函数

函数可以返回指针。例如:

int *getMax(int *a, int *b) {
    return (*a > *b) ? a : b;
}

int main() {
    int x = 10, y = 20;
    int *max = getMax(&x, &y);  // max指向y
    return 0;
}

7. 指针与动态内存分配

使用malloccallocreallocfree函数可以动态分配和释放内存。例如:

int *p = (int *)malloc(sizeof(int) * 5);  // 分配5个整数的内存
if (p != NULL) {
    // 使用p
    free(p);  // 释放内存
}

8. 空指针与无效指针

  • 空指针:空指针不指向任何有效的内存地址,通常用NULL表示。
int *p = NULL;
  • 无效指针:未初始化的指针或已经释放的指针称为无效指针,访问无效指针会导致未定义行为。

9. 指针数组与数组指针

  • 指针数组:存储指针的数组。例如:
int *arr[3];  // 包含3个指向int的指针
  • 数组指针:指向数组的指针。例如:
int (*p)[3];  // 指向包含3个int的数组的指针

10. 多级指针

指向指针的指针称为多级指针。例如:

int x = 10;
int *p = &x;
int **pp = &p;  // pp是指向p的指针

11. 函数指针

函数指针指向一个函数,可以用来调用函数。例如:

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

int (*func_ptr)(int, int) = add;  // func_ptr指向add函数
int result = func_ptr(10, 20);  // 调用add函数

总结

C语言的指针功能强大且灵活,但也容易出错。正确理解和使用指针需要大量的练习和经验。掌握了指针,你将能够编写更高效、更灵活的C程序。