1 取数组元素
a[i]等价于*(a+i) *表示间接引用,也就是(a+i)这个空间里对应的值
2 调用函数时的传值和传址(指针做函数参数,调用该函数时,传有效的地址值)
1 #include2 void swap(int a, int b) //值传递 3 { 4 int tmp = a; 5 a = b; 6 b = tmp; 7 printf("a=%d b=%dn", a, b); 8 } 9 10 void swap2(int *a, int *b) //址传递 11 { 12 int tmp = *a; 13 *a = *b; 14 *b = tmp; 15 printf("*a=%d *b=%dn", *a, *b); 16 } 17 18 int main(void) 19 { 20 int m = 10, n = 20; 21 printf("值传递交换前m=%d, n=%dn", m, n); 22 swap(m, n); 23 printf("值传递交换后m=%d, n=%dn", m, n); 24 printf("址传递交换前m=%d, n=%dn", m, n); 25 swap2(&m, &n); 26 printf("址传递交换后m=%d, n=%dn", m, n); 27 return 0; 28 }
运行结果:
结论:
传值只会改变形参的值不会改变实参的值;
传址形参和实参的值都会改变,通过改写该地址的内容而改变实参的值。
3 数组做函数参数
18 //void array(int a[])
19 void array(int *a)
20 {
21 printf("array: sizeof(a)=%lun", sizeof(a));
22 printf("a[0]=%dn", a[0]);
23 }
24
25 int main(void)
26 {
27 int a[] = {10, 21, 52, 532, 13};
28 printf("main: sizeof(a)=%lun", sizeof(a));
29 array(a);
30 return 0;
31 }
运行结果:
结论:
数组做函数参数时,传递的是该数组的指针,指针在64位系统下的大小是8,32位系统下的大小是4。
4 指针做函数返回值
int *test(int a, int b);
指针做函数返回值,不能返回【局部变量的地址值】。
5 数组做函数的返回值:
C语言不允许,只能写成指针形式。



