c语言中的指针用法
1、指向函数的指针
在C语言中,函数名实际上是一个指向函数的指针,所以你可以直接使用函数名add
来初始化函数指针,而不需要使用&add
。在这种情况下,add
和&add
是等价的。
这是因为在C语言中,函数名是函数的入口地址的别名。当你使用函数名时,你实际上获取的是函数的入口地址。这就是为什么你可以直接使用函数名来初始化函数指针的原因。
所以,以下两种方式都是可以的:
或者
它们都会创建一个函数指针数组,这个数组的元素都是指向一个接受两个int
参数并返回int
的函数的指针。
2、指向字符串的指针
这两种声明方式实际上是不同的,它们创建的数组类型和内容都不同。
char *arr[] = {"add", "subtract", "multiply", "divide", "module"};
这种方式创建的是一个指针数组。数组的每个元素都是一个字符指针,指向一个C风格的字符串(以null结尾的字符数组)。因此,arr[0]
是一个指针,指向字符串"add"
。
char arr[] = {"add", "subtract", "multiply", "divide", "module"};
这种方式试图创建一个字符数组,但是这是错误的。在C语言中,不能这样声明一个字符数组。你可以声明一个单一的字符串,如char arr[] = "add";
,这会创建一个字符数组,其中包含字符'a'
, 'd'
, 'd'
, 和一个结束符'\0'
。但是你不能一次声明多个字符串。
如果你想要创建一个包含多个字符串的数组,你应该使用字符指针数组,即第一种方式。
3、指针数组
在C语言中,int *p;
和int (*ptr)[5];
都是指针的声明,但它们指向的对象类型不同。
4、类型定义
#include <stdio.h> // 假设你已经定义了这些函数 int add(int, int); int substract(int, int); int multiply(int, int); int divide(int, int); int module(int, int); // 定义函数指针类型 typedef int (*operation_fun)(int, int); int main() { char *arr[] = {"add", "substract", "multiply", "divide", "module"}; // 初始化函数指针数组 operation_fun operations[] = { &add, &substract, &multiply, ÷, &module }; int result = 0; int i; for (i = 0; i < 5; i++) { result = operations[i](10, 20); printf("%s of two number result is %d\n", arr[i], result); } return 0; }
#include <stdio.h> #define MAX 10 void swap(int *x, int *y) { int temp; temp = *x; *x = *y; *y = temp; } void fun(int *height, int *age) { int n = 10; *height = n * 10; *age = n * 2000; } int *createArray(int size) { int i; int *arr = (int *)(malloc(sizeof(int) * size)); for (i = 0; i < size; i++) { arr[i] = i * i; } return arr; } int add(int x, int y) { return x + y; } int substract(int x, int y) { return x - y; } int multiply(int x, int y) { return x * y; } int divide(int x, int y) { return x / y; } int module(int x, int y) { return x % y; } typedef int (*operation_fun)(int, int); void main() { int num = 0; int (*ptr_add)(int, int) = add; void (*ptr_swap)(int, int) = swap; int a = 100, b = 200; int sum = ptr_add(a, b); ptr_swap(&a, &b); printf("the result is %d\n", sum); printf("after swap a is %d,b is %d\n", a, b); operation_fun operations[] = { &add, &substract, &multiply, ÷, &module}; // int (*operations[])(int, int) = {add, substract, multiply, divide, module}; // int (*operations[])(int, int) = {&add, &substract, &multiply, ÷, &module}; char *arr[] = {"add", "substract", "multiply", "divide", "module"}; int result = 0; int i; for (i = 0; i < 5; i++) { result = operations[i](10, 20); printf("%s of two number result is %d\n", arr[i], result); } // int a = 100, b = 200; // printf("before swap a is %d, b is %d\n", a, b); // swap(&a, &b); // printf("after swap a is %d, b is %d\n", a, b); // int p_height; // int p_age; // int *p_arr = createArray(MAX); // int i; // fun(&p_height, &p_age); // printf("height is %d and age is %d\n", p_height, p_age); // for (i = 0; i < MAX; i++) // { // printf("%d\n", p_arr[i]); // } // int c = 30; // int *ptr1 = &c; // int **ptr2 = &ptr1; // printf("c is %d\n", c); // printf("ptr1 is %d\n", *ptr1); // printf("ptr2 is %d\n", **ptr2); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现