C语言指针详解----函数参数与指针

来源:互联网 发布:windows home basic 编辑:程序博客网 时间:2024/06/05 15:45

 灵活的使用指针可以让函数传参更加方便,首先讲一下值传递的问题。

在C语言的函数中,存在形参和实参两种参数。形参即形式参数,是在函数声明或者实现时使用的参数;而实参,即实际参数,是在函数调用的时候使用的参数。下面举个例子说明:

void fun(int x,int y){//x、y为形参      x = y;      y = y + 1;}int a = 2;int b = 3;fun(a,b);//a、b为实参


在上述的情况下,运行fun(3,2)后,a、b的值均不会发生任何的变化,这是因为函数只对形式参数进行了操作,相当于走了一个过场,如果想要使函数运行后,a、b的值发生改变怎么做呢?这时候可以使用指针,举个例子:

void change(int *x,int *y){*x = *y;*y = *y + 1;}int main() {int a = 3;int b = 2;printf("%d\n%d\n", a,b);change(&a,&b);printf("%d\n%d\n", a,b);system("pause");return 0;}
这段代码运行的结果为 3 2 2 3,发现函数对传入参数的值进行了操作;上述代码是对C语言来说的,对于C++可以使用引用来实现相同的操作,举个例子:

void change(int &x,int &y){x = y;y = y + 1;}int main() {int a = 3;int b = 2;printf("%d\n%d\n", a,b);change(a,b);printf("%d\n%d\n", a,b);system("pause");return 0;}

这段代码的运行结果一样为 3 2 2 3。

对于结构体来说,由于存在大量对指针的操作,因此很多时候函数的参数为指针。下面举个例子:

typedef struct LNode {int data;struct LNode *next;}LNode,*LinkList;LNode *GetElem(LinkList L,int i) {int j = 1;LNode *p = L->next;if (i == 0) {return L;}if (i < 1) {return NULL;}while (p&&j<i) {p = p->next;j++;}return p;}LinkList CreatList(LinkList &L) {//头插法创立链表LNode *s;int x = 0;L = (LinkList)malloc(sizeof(LNode));L->next = NULL;while (x < 10) {s = (LNode*)malloc(sizeof(LNode));s->data = x;s->next = L->next;L->next = s;x++;}return L;}int main() {int i = 5;LNode *r;LinkList L;CreatList(L);r = GetElem(L, i);printf("%d\n",r->data);system("pause");return 0;}
上述代码运行结果为5(因为采用的是头插法),即找到所创建链表中的第5个元素对于函数 LNode *GetElem(LinkList L,int i),函数名前面的*表示该函数的返回值是一个指针类型。对于函数LinkList CreatList(LinkList &L),传入的参数为链表的首地址。