指针数组 数组指针

  • 指针数组
    写法:int* array[]
    特性:是一个数组,数组内容存放着指针
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    int main() {
    // 定义一个整型指针数组,每个元素都可以指向一个整数
    int* ptrArray[3];
    int var1 = 10, var2 = 20, var3 = 30;

    // 让指针数组的元素指向这些变量
    ptrArray[0] = &var1;
    ptrArray[1] = &var2;
    ptrArray[2] = &var3;

    // 访问并打印指向的值
    for(int i = 0; i < 3; i++) {
    printf("Value of var%d = %d\n", i+1, *ptrArray[i]);
    }

    return 0;
    }

  • 数组指针
    写法:int (*array)[]
    特性:是一个指针,指向一个数组
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main() {
    // 定义一个整型数组
    int arr[3] = {10, 20, 30};
    // 定义一个指向包含3个整型元素数组的指针
    int (*ptrToArray)[3] = &arr;

    // 通过数组指针访问数组元素
    for(int i = 0; i < 3; i++) {
    printf("Value of arr[%d] = %d\n", i, (*ptrToArray)[i]);
    }

    return 0;
    }

指针常量 常量指针

  • 指针常量
    写法: int * const a
    特性: 指针的指向不可以改变,但指针指向的值可以改变,即 *a=10 是允许的,a=&b则不允许

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    int main() {
    int var1 = 10;
    int var2 = 20;

    // 声明一个指针常量
    int* const ptrConst = &var1;

    // 可以通过指针常量修改其指向地址的值
    *ptrConst = 15; // 正确

    // 试图改变指针指向的地址将导致编译错误
    // ptrConst = &var2; // 错误

    return 0;
    }
  • 常量指针
    写法: int const * a
    特性: 指针的指向可以改变,但指针指向的值不可以改变,即 a=&b 是允许的,*a=10则不允许

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main() {
    int var1 = 10, var2 = 20;
    // 声明一个常量指针
    const int *ptr = &var1;

    // 通过指针试图改变var1的值将导致编译错误
    // *ptr = 15; // 错误

    // 可以改变指针指向的地址
    ptr = &var2; // 正确

    return 0;
    }
  • 根据写法记命名方式
    int * const a *在前,const在后,所以叫做指针常量
    int const * a const在前,*在后,所以叫做常量指针

  • 根据const修饰的对象记住对应的特性
    我们都知道const修饰的变量称为常量,常量具有不可变的性质,在指针常量和常量指针中也是一样,只要关注是什么对象被const修饰即可。
    int * const a const修饰是a,在这a为地址,所以地址不可变,地址不可变在变量的角度就是a的指向不能修改,但*a是可以修改的,所以a指向的值可以修改。
    int const * a const修饰的是*a,所以*a不允许修改,但a本身没有const修饰,是允许修改的,所以指针本身可以修改,但指针指向的值不可以修改。

指针函数 函数指针

  • 指针函数
    写法: int * func()
    特性: 指针函数实际上是一个函数,只不过返回值是一个指针,返回的指针可以是指向任何类型的指针,比如整型、字符型或者是结构体和数组的指针。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // 一个返回整型指针的函数
    int* getPointerTo(int number) {
    static int temp;
    temp = number;
    return &temp; // 返回局部静态变量的地址
    }

    int main() {
    // 在这里,func是一个指针函数
    int *ptr = getPointerTo(5);

    printf("Value is: %d\n", *ptr);
    return 0;
    }

  • 函数指针
    写法: int (*funcptr)(...) = func
    特性: 函数指针是指向函数的指针,它可以用来调用函数、传递函数地址等。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int add(int a, int b) {
    return a + b;
    }

    int main() {
    // 声明一个函数指针,并使其指向add函数
    int (*funcPtr)(int, int) = add;

    // 使用函数指针调用函数
    int sum = funcPtr(2, 3);
    printf("Sum is: %d\n", sum);
    return 0;
    }
    函数指针通常用于回调函数中,它可以让函数像变量一样复制使用,使程序更灵活。