C语言 传参...
时间: 2023-07-18 14:07:24 浏览: 90
在 C 语言中,函数参数传递分为两种方式:值传递和指针传递。
值传递是指将实参的值复制给形参,函数内部对形参的修改不会影响到实参。例如:
```c
void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int x = 1, y = 2;
swap(x, y);
printf("x=%d, y=%d\n", x, y); // 输出 x=1, y=2
return 0;
}
```
指针传递是指将实参的地址传递给形参,函数内部对形参指向的内存空间的修改会影响到实参。例如:
```c
void swap(int *pa, int *pb) {
int temp = *pa;
*pa = *pb;
*pb = temp;
}
int main() {
int x = 1, y = 2;
swap(&x, &y);
printf("x=%d, y=%d\n", x, y); // 输出 x=2, y=1
return 0;
}
```
注意,在指针传递中,需要使用取地址运算符 `&` 将变量的地址传递给形参,而在函数内部使用指针访问变量时,需要使用解引用运算符 `*`。
相关问题
C语言传参怎么传数组
在C语言中,当你传递数组给函数时,通常不会直接传递数组本身(即数组名),而是传递数组的首元素的地址。这是因为在函数内部,数组名只是一个指向数组第一个元素的指针。以下是如何在C语言中传参数组:
1. **标准做法** - 传递数组的首地址[^1]:
```c
void func(int arr[]) {
// 函数体可以访问arr[0]到arr[n-1]
}
int main() {
int numbers[] = {1, 2, 3, 4, 5};
func(numbers);
// ...
}
```
在这个例子中,`func(numbers)`实际上是调用了`func(&numbers[0])`。
2. **数组名作为参数** - 注意这里的特殊情况:
```c
void printArray(int *arr, int size) {
// 这里size用于确定要打印多少个元素
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
}
int main() {
int numbers[] = {1, 2, 3, 4, 5};
printArray(arr, sizeof(numbers)/sizeof(numbers[0])); // 常规做法会这样传参
// 或者更明确地指定数组大小
printArray(&numbers[0], 5); // 使用数组首元素地址
return 0;
}
```
在这种情况下,函数`printArray`接受的是数组的指针和数组长度,而不是数组本身。这允许函数处理不同大小的数组,只要知道每个元素的大小。
C语言传参如何判断传进来的结构体是哪个
在C语言中,如果你有一个结构体,并且需要区分不同类型的结构体实例,通常你会通过结构体指针来间接访问和判断。当你传递结构体到函数时,可以接收一个指向该结构体类型的指针。
例如,假设你有几种结构体类型,如`TypeA`, `TypeB`,它们都包含一个公共的字段`common_field`:
```c
typedef struct TypeA {
int common_field;
// 其他TypeA特有的字段...
} TypeA;
typedef struct TypeB {
int common_field;
// 其他TypeB特有的字段...
} TypeB;
```
当你在函数中接受这样的指针:
```c
void processStruct(void* ptr) {
if (ptr != NULL) {
TypeA* a = (TypeA*)ptr; // 假设你知道它是TypeA
if (a->common_field > 0) { ... }
TypeB* b = (TypeB*)ptr; // 同理,这里假设是TypeB
if (b->common_field < 0) { ... }
// 使用具体的类型检查公共字段或其他特性
}
}
```
在调用函数时,你需要明确地将正确的结构体类型转换给指针,然后才能使用其中的具体成员。如果不确定是哪种类型,你可能需要更复杂的类型断言、枚举或者在调用前检查结构体的特有字段。
阅读全文