形参与实参
- [1. 形参和实参](#1. 形参和实参)
- [2. 形参和实参的类型](#2. 形参和实参的类型)
- [3. 类型与字节数](#3. 类型与字节数)
- [4. 形参和实参的传递方式](#4. 形参和实参的传递方式)
- [5. 举例说明](#5. 举例说明)
- 总结
C语言中的形参(形式参数)和实参(实际参数)是函数传递数据时的重要概念。理解它们的类型和所占字节数有助于更好地掌握C语言的函数调用机制。
1. 形参和实参
-
形参(形式参数) :函数定义时在括号中的参数,起到占位作用。例如:
cvoid func(int a, float b) { // a 和 b 是形参 }
-
实参(实际参数) :调用函数时传入的具体值或变量。例如:
cint x = 5; float y = 3.14; func(x, y); // x 和 y 是实参
2. 形参和实参的类型
C语言支持不同类型的形参和实参,常见类型有:
- 基本数据类型 :如
int
、float
、char
等 - 指针类型 :如
int*
、float*
等 - 数组类型:数组作为形参时,会被转换为指向数组首元素的指针。
- 结构体类型:结构体作为形参时,可以通过值传递或指针传递。
3. 类型与字节数
在C语言中,不同数据类型的变量占用的内存字节数是不同的。这个字节数和平台相关,通常情况下的常见类型及其占用字节数如下:
基本数据类型:
int
:通常占用 4字节(在大多数平台上)float
:通常占用 4字节double
:通常占用 8字节char
:占用 1字节short
:通常占用 2字节long
:通常占用 4字节(在某些系统上,可能是8字节)
指针类型:
int*
、float*
、char*
等指针类型的字节数通常是平台相关的,通常在32位系统中指针占 4字节 ,在64位系统中指针占 8字节。
结构体类型:
- 结构体的字节数取决于其中包含的成员的类型及对齐要求。对齐规则可能导致结构体的实际字节数比简单的成员大小总和更大。
例如,假设有一个结构体:
c
struct Person {
char name[20]; // 20字节
int age; // 4字节
};
这个结构体可能占 24字节(因为有可能发生字节对齐,填充4字节对齐规则,导致结构体的实际大小可能是24字节)。
4. 形参和实参的传递方式
C语言中,函数传递参数的方式有两种:
- 值传递(pass by value):实参的值传递给形参,函数内修改形参的值不会影响实参。
- 引用传递(pass by reference):通过指针传递实参的地址,函数内可以修改实参的值。
5. 举例说明
值传递:
c
#include <stdio.h>
void func(int a) {
a = 10; // 修改形参a的值
}
int main() {
int x = 5;
func(x); // 传递x的值
printf("x = %d\n", x); // 输出x = 5,x的值未改变
return 0;
}
引用传递:
c
#include <stdio.h>
void func(int* a) {
*a = 10; // 通过指针修改实参
}
int main() {
int x = 5;
func(&x); // 传递x的地址
printf("x = %d\n", x); // 输出x = 10,x的值已改变
return 0;
}
在引用传递中,实际传递的是变量的地址,因此函数可以修改实参的值。
总结
- 形参 是在函数定义时使用的变量,而实参是在调用函数时传递的值。
- 基本数据类型 (如
int
、char
、float
等)有固定的字节数,通常依赖于平台(32位或64位)来决定指针类型和结构体大小。 - C语言传递参数时有值传递和引用传递两种方式,不同的方式会影响内存的使用和函数行为。