容易混淆的指针
指针数组和数组指针
int *a[10]- 指针数组,本质是数组,数组中的元素是int类型的指针。它加一相当于下标加一。常用于保存字符串。
int (*a)[10]- 数组指针,指针指向了一个数组入口,本质是一个指针。它加一的话就是指向数组末尾后的数据。常用于作为二维数组的行指针。
在前文中有提到,带括号的都是指针,不带括号的就是各种指针可指向的数据或者函数。
int **p- 二级指针,常用于代表指针数组,将指针数组传入函数中
指针函数和函数指针
int *fun(void)- 指针函数,返回一个指向int的指针。
int (*fun)(void)- 函数指针,指向一个返回int的函数。方便使用函数指针变量将函数作为参数传入。
一些特殊的指针
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);
NULL- 空指针,未赋值的指针都指向NULL。
- 比如
int *p = NULL;就是将p指向NULL。
void *p = malloc(sizeof(int));- 动态分配内存,返回一个指向void的指针,即通用指针。
void *p = calloc(sizeof(int), 10);- 动态分配内存,返回一个指向void的指针,即通用指针。
mian函数传参
int main(int argc, char *argv[], char *envp[])- argc是命令行参数的个数
- argv是命令行参数的数组。
- envp是环境变量的数组;可省略。