当函数调用时,系统会在stack空间上申请一块内存区域,用来供函数调用,主要存放形参和局部变量。(定义在函数内部)
当函数调用结束,这块内存区域自动 被释放(消失)
传值和传址:
传值:函数调用期间,实参将自己的值,拷贝一份给形参。
int main(void)
{
int m = 23;
int n = 57;
printf("--before--m=%d,n=%dn",m,n);
swap(m, n);
printf("--after--m=%d,n=%dn",m,n);
system("pause");
return EXIT_SUCCESS;
}
int swap(int a, int b)
{
int tmp = 0
tmp = a;
a = b;
b = tmp;
return 0;
}
传址:
函数调用期间,实参将地址值拷贝一份给形参
int swap(int, int);
int swap2(int*, int*);
int main(void)
{
int m = 23;
int n = 57;
printf("--before--m=%d,n=%dn",m,n);
//函数调用
//swap(m,n); //m/n 实参
swap2(&m, &n);
printf("---after-- m=%d,n=%dn", m, n);
system("pause");
return EXIT_SUCCESS;
}
int swap2(int* a, int* b)
{
int tmp = 0;
tmp = *a;
*a = *b;
*b = tmp;
return 0;
}
输出:
--before--m=23,n=57
---after-- m=57,n=23
地址值----》在swap函数找栈帧内部,修改了main函数栈帧内部的局部变量值
数组作为函数参数:
void BubblesSort (int arr[10]) == void BubbleSort(int arr[]) ==void BubbleSort(int *arr)
传递的不再是整个数组,而是数组的首地址。(一个指针的大小)
所以,当整形数组做函数参数时,我们通常在函数定义中,封装2个参数。一个表数组首地址,一个表元素个数。
void BubbleSort(int arr[])
{
int n = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < n - 1; i++)
{
for (int j = 0; j < n - 1 - i; i++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int main(void)
{
int arr[] = { 5,3,6,2,1,4,7,8,56 };
int n = sizeof(arr) / sizeof(arr[0]);
BubbleSort(arr);
for (size_t i = 0; i < n; i++)
{
printf("%d",arr[i]);
}
printf("n");
system("pause");
return EXIT_SUCCESS;
}
指针做函数返回值:
int *test_func(int a,int b);
指针做函数返回值,不能返回局部变量的地址值。
int m = 100;
int* test_func2(int a, int b)
{
return &m;
}
int main(void)
{
int* ret = NULL;
ret = test_func2(10, 20);
printf("ret=%dn",*ret);
system("pause");
return EXIT_SUCCESS;
}
输出:
ret=100
数组做函数返回值:
c语言中不允许,只能写成指针形式



