您的位置:首页 > 其它

函数参数的值传递和地址传递

2017-03-09 16:50 204 查看
利用一个小例子说明,见代码。

#include<stdio.h>
void F1(int *pp)
{
pp++;
*pp = 9;
}

void F2(int **pp)
{
(*pp)++;
}
//以上函数中,接收数据的参量都是pp,而不会是*pp或者**pp

int* F3(int *pp)
{
pp++;
return pp;
}

int main(void)
{
int *p;
int a[2] = { 4,5 };
p = a;
printf("1--------%d\n", *p);//开始值为4

F1(p);
printf("2--------%d\n", *p);//4
//由于只是传值,在子函数F1的内部改变复制品的值,并不会改变原品p的值
//可以理解为用两个变量指向同一个地址,即形参pp和实参p指向同一个地址
//其中形参pp++,另外一个实参p并不会受影响
//但是可以修改指针所指的值,如F1代码中将a[1]的值改为9;
printf("2`-------%d\n", a[1]);//9

F2(&p);
printf("3--------%d\n", *p);//9
//传址,pp=&p(指针的地址,即pp是指向指针的指针),*pp=*(&p)=p;
//如果要修改指针p,则应该传入指针p的地址(&p),此时进行*pp++操作,其实是对实参指针p进行操作

getchar(); getchar();
return 0;
}

//这个例子说明:如果要在子函数中修改主函数传过来的指针的指向,那么主函数应该向子函数传入指针的地址(而非指针本身);
//此时在子函数中进行*操作后可以获得原来指针,而不是原来指针的复制品,之后可以根据需要修改指针。
//或者,将返回值类型改为指针类型,然后返回修改后的指针,给原来主函数的指针,如F3函数,此时在主函数中需要添加p=F3(p)代码。


#include <stdio.h>
#include <stdlib.h>
#include<string.h>
/*void getmemory(char **p)
{
*p = (char *)malloc(100);
strcpy(*p, "helloworld");
//return p;
}
int main()
{
char* str = NULL;
getmemory(&str);
printf("%s", str);
free(str);
getchar();
return 0;
}*/

char* getmemory(char *p)
{
p = (char *)malloc(100);
strcpy(p, "helloworld");
return p;
}
int main()
{
char* str = NULL;
str = getmemory(str);
printf("%s", str);
free(str);
getchar();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐