#include <stdio.h>
/*
栈 帧:
当函数调用时,系统会在 stack 空间上申请一块内存区域,用来供函数调用,主要存放 形参 和 局部变量(定义在函数内部)。
当函数调用结束,这块内存区域自动被释放(消失)。
传值和传址:
传值:函数调用期间,实参将自己的值,拷贝一份给形参。
传址:函数调用期间,实参将地址值,拷贝一份给形参。 【重点】
(地址值 --》 在swap函数栈帧内部,修改了main函数栈帧内部的局部变量值)
*/
int swap(int m, int n); // 实参传值
int swap1(int *m, int *n); // 实参传址
int main0701(void)
{
int a = 10;
int b = 20;
printf("before a = %d b = %d\n", a, b);
swap(a,b);
printf("after a = %d b = %d\n", a, b);
swap1(&a, &b);
printf("after a = %d b = %d\n", a, b);
return 0;
}
// 实参传值
int swap(int m, int n)
{
int temp = 0;
temp = m;
m = n;
n = temp;
return 0;
}
// 实参传址
int swap1(int *m, int *n)
{
int temp = 0;
temp = *m;
*m = *n;
*n = temp;
return 0;
}
/*
数组做函数参数:
void BubbleSort(int arr[10]) == void BubbleSort(int arr[]) == void BubbleSort(int *arr)
传递不再是整个数组,而是数组的首地址(一个指针)。
所以,当整型数组做函数参数时,我们通常在函数定义中,封装2个参数。一个表数组首地址,一个表元素个数。
*/
void bubblesort(int *arr, int len);
int main0702(void)
{
int arr[] = {1,5,0,8,6,7};
int len = sizeof(arr) / sizeof(arr[0]);
bubblesort(arr,len);
for (size_t i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
void bubblesort(int *arr, int len)
{
// int len1 = sizeof(arr) / sizeof(arr[0]); // 输出1
// int len2 = sizeof(arr); // 输出4
for (size_t i = 0; i < len-1; i++)
{
for (size_t j = 0; j < len-1-i; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = 0;
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
/*
指针做函数返回值:
int *test_func(int a, int b);
指针做函数返回值,不能返回【局部变量的地址值】。
数组做函数返回值:
C语言,不允许!!!! 只能写成指针形式。
*/
int *test(int a, int b);
int m = 10; // 全局变量。。程序结束===》对应空间释放
int main0703(void)
{
int a = 10; // 局部变量
int b = 20;
int *p = NULL;
p = test(a, b);
printf("%d", *p);
return 0;
}
int *test(int a, int b)
{
return &m;
}
13 C语言基础--------栈帧、传值、传址、数组做函数参数、指针做函数返回值
最新推荐文章于 2023-01-20 15:10:45 发布