指针知识的补充

800 词

容易混淆的指针


指针数组和数组指针

  1. int *a[10]

    • 指针数组,本质是数组,数组中的元素是int类型的指针。它加一相当于下标加一。常用于保存字符串。
  2. int (*a)[10]

    • 数组指针,指针指向了一个数组入口,本质是一个指针。它加一的话就是指向数组末尾后的数据。常用于作为二维数组的行指针。

前文中有提到,带括号的都是指针,不带括号的就是各种指针可指向的数据或者函数。

  1. int **p
    • 二级指针,常用于代表指针数组,将指针数组传入函数中

指针函数和函数指针

  1. int *fun(void)

    • 指针函数,返回一个指向int的指针。
  2. int (*fun)(void)

    • 函数指针,指向一个返回int的函数。方便使用函数指针变量将函数作为参数传入。

一些特殊的指针

  1. void *p
    • 表示通用指针,或者未定义类型的指针,任何类型的指针都可以赋值给它。
  • 比如常用的memset函数void *memset(void *s, int c, size_t n);功能就是将s指向的内存的前n个字节全部用c赋值。这里就用了通用指针s,且返回值也是通用指针。
  • 在C99标准中,使用void *p = malloc(sizeof(int))来为这种通用指针赋值从而分配内存被认为是安全的;如果你想要在堆上开辟一片数组,则可以使用void *p = calloc(sizeof(int), 10);
  1. NULL
    • 空指针,未赋值的指针都指向NULL。
  • 比如int *p = NULL;就是将p指向NULL。
  1. void *p = malloc(sizeof(int));

    • 动态分配内存,返回一个指向void的指针,即通用指针。
  2. void *p = calloc(sizeof(int), 10);

    • 动态分配内存,返回一个指向void的指针,即通用指针。

mian函数传参

  1. int main(int argc, char *argv[], char *envp[])
    • argc是命令行参数的个数
    • argv是命令行参数的数组。
    • envp是环境变量的数组;可省略。