- 传数值
#include <stdio.h>
// 函数的传参方式之数值传参
void myfun2(int p,int q)
{
int tmp;
tmp = p;
p = q;
q = tmp;
printf("in fun2: p = %d, q = %d\n", p, q); // in fun2: p = 20, q = 100
printf("&p = %p, &q = %p\n", &p ,&q); // &p = 0060FE80, &q = 0060FE84
}
int main(int argc, char *argv[])
{
int a = 100 , b =20;
printf("a=%d, b=%d\n", a, b); // a=100, b=20
myfun2(a, b);
printf("&a = %p, &b = %p\n", &a, &b); // &a = 0060FE9C, &b = 0060FE98
printf("a=%d, b=%d\n", a, b); // a=100, b=20
return 0;
}
- 传地址
#include <stdio.h>
// 函数的传参方式之地址传参 将实参的地址传递给形参
void myfun2(int *p,int *q)
{
int tmp;
tmp = *p;
*p = *q;
*q = tmp;
printf("in fun2: *p = %d, *q = %d\n", *p, *q); // in fun2: *p = 20, *q = 100
printf("p = %p, q = %p\n", p ,q); // p = 0060FE9C, q = 0060FE98
}
int main(int argc, char *argv[])
{
int a = 100 , b =20;
myfun2(&a, &b);
printf("&a = %p, &b = %p\n", &a, &b); // &a = 0060FE9C, &b = 0060FE98
printf("a=%d, b=%d\n", a, b); // a=20, b=100
return 0;
}
注意:举例 ==>传值和传地址对比案例
#include <stdio.h>
void fun(char *p)
{
p = "hello kitty";
}
void fun2(char **q)
{
*q = "hello kitty2";
}
int main(int argc, char *argv[])
{
char *p = "hello world";
fun(p); // 这里是传的值
printf("%s\n", p); // hello world
char *p1 = "hello world";
fun2(&p1); // 这里传的是地址
printf("%s\n", p1); // hello kitty2
return 0;
}
将数组作为参数传递给函数,本质都是地址传参
- 传数组
#include <stdio.h>
// 传一维数组
//void fun1(int p[])
void fun1(int *p)
{
printf("%d\n",p[2]); // 3
printf("%d\n", *(p+3)); // 4
// printf("%d\n", *p + 3); // 4
printf("%d\n", *(p + 7)); // 8
// printf("%d\n", *(p + 10)); //
}
void test2()
{
int a[10] = {1,2,3,4,5,6,7,8};
fun1(a);
}
// 传二维数组
//void fun2(int p[][4])
void fun2( int (*p)[4] ) // 数组指针的方式
{
printf("%d\n", p[0][2]); // 3
printf("%d\n", *(*(p+1) +2 )); // 7
}
void test3()
{
int a[2][4] = {1, 2, 3, 4,
5, 6, 7, 8};
fun2(a);
}
// 传指针数组
void fun3(char **q) // 这里传的是地址
{
int i;
for (i=0; i<3; i++)
{
printf("%s\n", q[i]);
/*
hello
world
kitty
*/
}
}
void test4()
{
char *p[3] = {"hello", "world", "kitty"};
printf("%s\n",*p); // hello
printf("%s\n",*(p+1)); // world
printf("%s\n",*(p+2)); // kitty
fun3(p);
}
int main(int argc, char *argv[])
{
test2();
test3();
test4();
return 0;
}
- 指针函数
#include <stdio.h>
// 指针函数:指针作为函数的返回值
char *fun4()
{
// char str[100] = "hello world"; // 栈区开辟的空间,会随着当前代码段的结束而释放空间
static char str[100] = "hello world"; // 静态区的空间不会随着当前代码段的结束而释放空间
return str;
}
void test5()
{
char *p;
p = fun4();
printf("p = %s\n", p); // p = hello world
}
int main(int argc, char *argv[])
{
test5();
return 0;
}
- 函数指针