C语言指针详解----函数参数与指针
2017-10-22 15:10
375 查看
灵活的使用指针可以让函数传参更加方便,首先讲一下值传递的问题。
在C语言的函数中,存在形参和实参两种参数。形参即形式参数,是在函数声明或者实现时使用的参数;而实参,即实际参数,是在函数调用的时候使用的参数。下面举个例子说明:
在上述的情况下,运行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),传入的参数为链表的首地址。
在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),传入的参数为链表的首地址。
相关文章推荐
- 用指针处理C语言中不定数目的函数参数[转]
- C语言可变参数函数详解 va_list va_arg va_start宏
- C语言 用指针作为函数返回值详解
- C语言提高-第23/24/25讲: 指针的运算/数组名作为函数参数/指针作函数参数(一维数组Vs指针)
- C语言中函数之指针参数
- c语言 函数 用指针传递参数 问题
- c语言数组参数和返回数组函数详解
- 指针做函数参数——高效C语言
- C语言:指针做函数参数
- C语言面向对象之继承、多态、可变参数、函数指针
- C语言中,数组名作为参数传递给函数时,退化为指针
- C语言(Head First C)-8:高级函数:函数指针 qsort() 可变参数函数
- C语言 函数指针(指向函数的指针)详解
- C语言及程序设计提高例程-25 指针作函数参数
- c语言中一级指针和二级指针做函数参数
- 《IOS_作业C语言》高级指针(结构体指针、结构体数组指针、结构体数组指针,作为函数的参数使用、预编译指令)
- c语言 指向函数的指针作函数参数
- c语言指针做函数参数,使用指针地址(二级指针)在被调函数中修改主调函数的指针。
- C语言之最好理解的通过函数指针作为参数实现回调函数
- C语言 指针变量作为函数参数详解