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

 

灵活的使用指针可以让函数传参更加方便,首先讲一下值传递的问题。在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),传入的参数为链表的首地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值