第一次写博客 哈哈,兴奋。
今天突然发现虚拟机中突然发现一个小的测试例子 ,自己都不记得了,仔细研究了一下我发现我居然是做错了,好吧 c语言还是不扎实,不过关,虽然工作了一年了,唉;
这是一个关于函数传参并且考察指针操作的例子,直接上例子;
#include <stdio.h> #define ULONG unsigned long #define STATIC static #define VOID void #define IN STATIC ULONG g_aulData[3] = {100, 200, 300}; VOID FuncB(IN ULONG *pulB) { *pulB += 1; pulB += 1; *pulB += 1; return; } VOID FuncA(IN ULONG **ppulA) { **ppulA += 1; *ppulA += 1; **ppulA += 1; FuncB(*ppulA); return; } int main(int argc, const char *argv[]) { ULONG *pulData = g_aulData; FuncA(&pulData); printf("%lu\r\n", *pulData); return 0; }
在函数FuncA中和函数FuncB中,关于指针的每一个操作的我还是可以理解的,main函数中,给FuncA传递的参数相当于&(数组名),也就是一个二级指针,再FuncA中的也是几个指针的基本操作:
**ppulA+=1 是把数组中第一个元素100+1变成101。
*ppulA+=1 是把*ppulA这个指针指向200,指针+1,指向数组的下一个元素;
**ppulA+1 是把数组中的第二个元素200+1变成201;
FuncB(*ppulA)中把*ppulA参数传给了函数FuncB,其实*ppulA现在指向的是数组的第二个元素201,因为FuncA第三个操作已经把数组第二个元素200改变为了201;
在函数B中的一些操作更加简单
*pulB += 1; 把数组中第2个元素201+1变成202;
pulB += 1; 指针指向数组第三个元素300;
*pulB += 1; 数组第三个元素300+变成301;
到现在你们猜main函数中printf("%lu\r\n", *pulData);这个语句会打印什么,如果你猜301,不好意思 ,你错了,如果你答202,那恭喜你,你答对了。
这里为什么是202 呢,其实在我们调用FuncB的时候,传进去的*ppulA这个参数,作用域是在FuncA中的,*ppulA所指向的内容是可以改变的,比如*pulB+=1,可以改变数组中201的值。但是如果对这个参数*ppulA本身进行操作导致参数*ppulA发生改变的时候,比如pulB+=1,指向数组中元素300;在函数FuncB其实pulB确实指向了300,但是对FuncA中传的*ppulA的值没有影响,在函数FuncA中*ppulA依旧指向数组第二个元素201.如果您还不明白您可以去别的地方好好了解一下函数的形参这个概念,个人能力所限,不能再更加详细的说明这个问题了 ,对不起大家。
例子是个好例子,讲解的水平太菜了,各位多包涵;