C 语言--函数指针形参

C语言传值与传址

今天写代码,自以为只要是传递指针,就能达到自己的任何目的,比如说改变指针的所指向的内容。
一切看起来似乎很简单。

#include <stdio.h>

void test(char *des, char *src)
{
    des = src;
}

int main(void)
{
    char *src = "hello world!";
    char *des = NULL;
    test(des, src);
    return 0;
}

想法是:通过传值来改变指针des所指向的对象,使用函数更显紧凑,符合模块化编程。另外,如果可以的话,将test的返回值改为int,返回代码块 的错误码。这样的面向过程编程,没毛病。

现实是残酷的。
当程序运行到test的最后的括号时,打印出来两个函数中的des:

(gdb) p main::des
$2 = 0x0
(gdb) p test::des
$3 = 0x400604 "hello world"

说明,函数进行传参时,只是简单的将NULL传给了形参des,而形参des值的改变不会影响main::des;
那么,根据理论,要改变对象的值,就传递它的地址吧!

void test(char **des, char *src)
{
    *des = src;
}

int main(void)
{
    char *src = "hello world!";j
    char *des = NULL;
    test(&des, src);
    return 0;
}
(gdb) p &main::des
$3 = (char **) 0x7fffffffd5e8
(gdb) p test::des
$4 = (char **) 0x7fffffffd5e8
(gdb) p main::des
$5 = 0x4006a4 "hello world"
(gdb) p *test::des
$6 = 0x4006a4 "hello world"

总结

所有函数传参都是传递一份拷贝,那份拷贝在实参和形参是独立的,互不影响。
传递指针也一样,指针也是对象,传递的是指针中存的地址值;
想通过传参改变实参的值,需要传递你想改变的变量的地址,改变变量,只要得到其地址,就可以通过解引用来改变它,不管是int还是指针,都是一个道理

### C语言函数数使用指针的方式 #### 函数指针作为形 可以声明一个指向某个函数指针,然后将该指针用作另一个函数数。指向函数指针声明如下: ```c type (*pointer-name)(parameter); ``` 下面是一个具体的例子来展示如何实现这一点[^1]。 ```c #include <stdio.h> // 定义两个简单的函数用于加法和减法操作 int add(int a, int b) { return a + b; } int subtract(int a, int b) { return a - b; } // 声明并定义接受函数指针作为数的函数 void performOperation(int (*operation)(int, int), int x, int y) { printf("Result of operation: %d\n", operation(x, y)); } int main() { // 调用performOperation分别传入add和subtract函数地址 performOperation(add, 5, 3); // 输8 performOperation(subtract, 5, 3); // 输2 return 0; } ``` 这段代码展示了如何通过传递不同类型的运算给`performOperation`函数来执行不同的计算逻辑。 #### 数组指针指针数组作为形 对于数组指针指针数组这两种形式,在C语言里有着细微的区别。前者是指向整个数组的一个指针;后者则是一系列指向单个元素的指针组成的数组。具体应用方式见下述实例[^2]。 ##### 指针数组作为形的例子 当需要处理多个字符串或其他数据集合时,可能会遇到这种情况: ```c #include <stdio.h> #include <string.h> void printStrings(char *strArray[], size_t count) { for (size_t i = 0; i < count; ++i) { puts(strArray[i]); } } int main(){ char* strings[] = {"Hello", "World"}; printStrings(strings, sizeof(strings)/sizeof(*strings)); return 0; } ``` 在这个案例中,`printStrings`接收了一个字符型指针数组(`char *strArray[]`)作为其第一个数,并遍历打印每一个字符串成员。 ##### 数组指针作为形的例子 如果要访问一个多维数组中的特定维度,则可能需要用到数组指针形式: ```c #include <stdio.h> void printMatrixRow(int (*matrix)[4], size_t rowIdx){ for(size_t col=0;col<4;++col){ printf("%d ", matrix[rowIdx][col]); } putchar('\n'); } int main(){ int mat[3][4]={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12} }; printMatrixRow(mat, 1); return 0; } ``` 这里`printMatrixRow`接收到的是一个二维整数矩阵的一行的数据(即一维数组),并通过指定索引来获取对应的那一行的内容进行输
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值