C语言指针用法详解
目录
一、指针数组(Array of Pointers)
二、数组指针(Pointer of Array)
三、函数指针(Pointer to Function)
四、指针函数(Function Returning Pointer)
五、函数指针数组(Array of Function Pointers)
六、指针函数数组(Array of Functions Returning Pointers)
七、记忆技巧
一、指针数组(Array of Pointers)
是一个数组,其元素都是指针。
形式:类型 *名字数组名[大小]
本质:数组元素都是指针
int *ptr_arr[5]; // 包含5个int指针的数组
int a = 1, b =2, c = 3;
int *ptr_arry[3] = {&a, &b, &c}; // 指针数组for(int i = 0; i < 3 ; i++)
{printf("", *ptr_arr[i]); // 输出:1 2 3
}
二、数组指针(Pointer of Array)
数组指针是指向数组的指针。
形式:类型 (*指针名)[大小]
本质:指向整个数组的指针
int (*arr_ptr)[5]; // 指向包含5个int的数组的指针
int arr[3] = {10, 20, 30};
int (*arr_ptr)[3] = &arr; // 数组指针printf("%d\n", (*arr_ptr)[1]); // 输出: 20
int (*arr_ptr)[3] = &arr; // 数组指针 为什么要写成&arr ?
在C语言中,数组名在大多数情况下会“退化”成指向数组首元素的指针。例如:
int arr[3] = {10 , 20, 30}; int *ptr = arr;pritf("%d\n", *ptr); // 输出arr[0]的值为10
这里的arr会“退化”成指向arr[0]的指针,所以ptr是一个指向int类型的指针,它指向数组arr的第一个元素。
&arr所取的是整个数组的地址,其类型为int (*)[3],也就是指向包含3个int类型元素的数组的指针。
三、函数指针(Pointer to Function)
函数指针是指向函数的指针。
形式:返回类型 (*指针名)(参数列表)
本质:指向函数的指针。
int (*func_ptr)(int, int); // 指向返回int、接受两个int参数的函数
int add(int a, int b) { return a + b;}
int (*func_ptr)(int, int) = add; // 函数指针printf("%d\n", func_ptr(3, 5)); // 输出:8
四、指针函数(Function Returning Pointer)
指针函数是返回指针的函数。
形式:返回类型 *函数名(参数列表)
本质:返回指针的函数
int *get_ptr(int x); // 返回int指针的函数
int *get_address(int *p) { //指针函数return p;
}int num = 42;
int *p = get_address(&num);
printf("%d\n", *p); // 输出:42
五、函数指针数组(Array of Function Pointers)
是一个数组,其元素都是指向函数的指针。
形式:返回类型 (*数组名[大小])(参数列表)
本质:数组元素都是函数指针
int (*func_arr[3])(int); // 包含3个函数指针的数组,每个指针指向返回int,接受一个int参数的函数
#include <stdio.h>//定义几个函数
int add(int a, int b){ return a + b; }
int sub(int a, int b){ return a - b; }
int mul(int a, int b){ return a * b; }int main(void){//声明并初始化函数指针数组int (*func_ptr_arr[3])(int, int) = {add, sub, mul};//使用函数指针数组for(int i = 0; i < 3; i++){printf("Result: %d\n", func_ptr_arr[i](10,5));}/* 输出Result: 15Result: 5Result: 50*/return 0;
}
六、指针函数数组(Array of Functions Returning Pointers)
指针函数数组是一个数组,其元素都是返回指针的函数。这两种用法在实际中较为少见,因为通常函数指针数组更为常用。
形式:返回类型 *(*数组名[大小])(参数列表)
本质:数组元素都是返回指针的函数(罕见用法)
int *(*ptr_func_arr[2])(int); // 包含2个函数的数组,每个函数返回int指针、接受一个int参数
#include <stdio.h>
#include <stdlib.h>//定义几个返回指针的函数
int *create_int(int value){int *p = malloc(sizeof(int));*p = value;return p;
}float *create_float(float value){float *p = malloc(sizeof(float));*p = value;return p;
}int main(void)
{//声明指针函数的数组(不常见用法)void *(*func_arr[2])() = {(void *(*)())create_int,(void *(*)())create_float};// 使用指针函数数组int *int_ptr = ((int *(*)())func_arr[0])(42);float *float_ptr = ((float *(*)())func_arr[1])(3.14f);printf("int: %d, float: %.2f\n", *int_ptr, *float_ptr);free(int_ptr);free(float_ptr);return 0 ;
}
七、记忆技巧
类型 | 关键特征 | 形式规律 |
---|---|---|
指针数组 | 先有数组,元素是指针 | 类型 *名字[] |
数组指针 | 先有指针,指向数组 | 类型 (*名字)[] |
函数指针 | 先有指针,指向函数 | 返回类型 (*名字)(参数) |
指针函数 | 先有函数,返回指针 | 返回类型 *名字(参数) |
函数指针数组 | 先有数组,元素是函数指针 | 返回类型 (*名字[])(参数) |
指针函数数组 | 先有数组,元素是返回指针的函数 | 返回类型 *(*名字[])(参数) |
函数指针数组和指针函数数组关键区别:
- 函数指针数组:数组元素是指向函数的指针
- 指针函数数组:数组元素是返回指针的函数