函数指针参数的传入:int型
#include <stdio.h>
#include <string.h>
void fun(int *p)
{
*p = 8; //这边(*p)表示传进来的是a的地址,改变(*p)的值,就是改变a的地址里面的值
printf("函数:p指向:%p, p指向地址中的值: %d,p的地址:%x \n",p,*p,&p); //这里可以对比主函数p本身地址,和函数p本身的地址是不一样的
int b = 9;
p = &b; //这里是把函数的p指向b的地址,所以无法影响主函数中的p
printf("函数:p指向:%p, p指向地址中的值: %d,p的地址:%x \n",p,*p,&p);
}
int main(int argc, char* argv[])
{
int a = 7;
printf("主函数:a的地址:%x \n",&a);
int *p = NULL; //p一开始的地址:adcd4e30
printf("主函数:p指向:%p, p的地址:%x \n",p,&p);
p = &a; //现在p指向a的地址: adcd4e2c
printf("主函数:p指向:%p, p指向地址中的值: %d,p的地址:%x \n",p,*p,&p);
fun(p); //这里是把a的地址传进去: adcd4e2c
printf("主函数:p指向:%p, p指向地址中的值: %d,p的地址:%x \n",p,*p,&p);
return 0;
}
结果:
函数指针参数的传入:char型
#include <stdio.h>
#include <string.h>
#define SIZE 32
void fun(char *p)
{
char b[SIZE] = {0};
memset(b,0,sizeof(b));
strcpy(b,p); //b复制p中地址的值
printf( "b的值: %s\n",b);
}
int main(int argc, char* argv[])
{
char a[SIZE] = "hello is me!";
fun(a);
return 0;
}
结果:
函数指针参数的传出:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SIZE 32
void fun(char **p)
{
char b[SIZE] = "hello is me !";
strcpy(*p,b);
}
int main(int argc, char* argv[])
{
char *p = NULL;
//开辟SZIE大小的空间,来存放函数返回的值
p = (char *)calloc(1,SIZE);
if(NULL == p)
{
printf("calloc is error \n");
p = NULL;
}else{
fun(&p); //把p的地址传进去,这个地址我们已经开辟了一个空间
printf("p的值: %s\n", p);
}
//用完之后,释放p的空间
if(NULL != p)
{
free(p);
p = NULL; //p要等于NULL,不然会成为野指针
}
return 0;
}
结果: