子函数调用主函数指针 (C语言) 在此之前,首先要了解一下 C 语言中的取值和取地址操作。 取地址(&)和取值(*) (1) 常规变量的存储:例如 int a = 5。计算机会开辟一段 int 大小的内存,并将 a 指向这段内存,而这段内存所处的位置即为 “地址”,然后将5转为二进制存储在这段内存中。 (2) 指针变量的存储:与常规变量不同的是,为指针变量开辟的内存中存放的是 “地址”,而不是常规意义的数值,并且可以通过指针操作该地址所指向的内存。 取地址操作的对象可以是常规变量也可以是指针变量,会得到变量所指向内存的地址;取值操作的对象只能是指针变量(包含一级指针、二级指针、三级指针),会得到该指针所存储的地址指向的内存中的数据。
在了解了取地址和取值操作后,接下来说明如何在子函数中对主函数中定义的指针变量进行分配内存、赋值等 1 返回单个指针 在子函数中分配内存、赋值等,并将该指针作为返回值,并在主函数中对主函数中定义的指针进行赋值 (参考最下方代码 array1d_i),之后就可以在主函数中继续对指针进行操作了。 2 返回多个指针 当我们需要在子函数对多个主函数中的指针进行分配内存、赋值等操作时,仅仅通过函数返回值是无法实现的,因为C语言的单个函数只能有0或1个返回值,所以需要利用传参的方式完成。为了能在子函数中的操作可以直接同步到主函数,同时省去多余的赋值操作,此时我们在传递参数时应该将主函数中变量的地址传入子函数。
例如:(这里我们暂且将常规变量视为零级指针) 在主函数中定义了指针变量 a,这个指针变量需要进入子函数之后才能确定其所需的内存空间大小,并在子函数中进行赋值、计算等操作。 (1) 将该指针变量以引用的方式 (地址) 传入子函数,即 &a (2) 在声明子函数时要进行 “指针升级”,即 主函数中如果是一级指针 * a,以引用的方式传入子函数中时,在声明子函数时应该使用二级指针 a。 (3) 在子函数中进行分配空间、赋值、计算等操作时,要采用 * a 而不是 a,即对二级指针进行取值操作,此时取值操作的结果等效于一级指针,并且在必要时要将 *a 用括号括起来。
以下是一个简单的示例程序: 测试程序 #include <stdio.h> #include<stdlib.h> int* array1d_i(int d) { int i; int* arr = NULL; arr = (int*)malloc(d * sizeof(int)); if (arr){ for (i = 0; i < d; i++){ *(arr + i) = 0;}} return arr;} void fun2(int* a){ int i; for (i = 0; i < 3; i++){ a[i] = a[i] + 1;}} void fun1(int a){ int i; *a = array1d_i(3); for (i = 0; i < 3; i++){ (*a)[i] = i;} fun2(*a);} int main(int argc, char argv){ int* a; fun1(&a); printf(“%5d %5d %5d”, a[0], a[1], a[2]);}
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/87415.html