C语言函数参数的传值和传址调用

大家都知道,c语言一般的参数都是传值调用的,但有时候也有例外,下面就分析一下什么时候传值调用,什么时候传址调用。

传值调用

标量参数都是传值调用,不会对标量产生任何影响

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
void add_one(int value) {
value += 1;
}
int main(int argc, char const *argv[]) {
int value = 10;
printf("传值前value=%d\n", value);
add_one(value);
printf("传值后value=%d\n", value);
return 0;
}

运行结果:

1
2
3
4
传值前value=10
传值后value=10
Process returned 0 (0x0) execution time : 0.110 s
Press any key to continue.

传址调用

数组和指针参数是传址调用,相当于传递了一个包含参数地址的指针,在函数中对数组或指针的任何操作会间接的改变数组和指针的本身

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
#define SIZE 4
void clr_nums(int nums[], int size) {
int i;
for (i = 0; i < size; i++) {
nums[i] = 0;
}
}
void clr_string(int *string) {
*string = " ";
}
int main(int argc, char const *argv[]) {
int nums[] = {1,2,3,4};
int *string = "Hello";
int i;
printf("传址前\n");
printf("nums= ");
for (i = 0; i < SIZE; i++) {
printf("%d ", nums[i]);
}
printf("string=%s\n", string);
clr_nums(nums, SIZE);
clr_string(&string);
printf("传址后\n");
printf("nums= ");
for (i = 0; i < SIZE; i++) {
printf("%d ", nums[i]);
}
printf("string=%s\n", string);
return 0;
}

运行结果:

1
2
3
4
5
6
传址前
nums= 1 2 3 4 string=Hello
传址后
nums= 0 0 0 0 string=
Process returned 0 (0x0) execution time : 0.111 s
Press any key to continue.