您的位置:首页 > 编程语言 > C语言/C++

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

2017-10-22 15:10 375 查看
灵活的使用指针可以让函数传参更加方便,首先讲一下值传递的问题。
在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),传入的参数为链表的首地址。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: