C语言和Java语言一样都是值传递,实际传递的是一个入参的副本,并不改变入参的值。
eg1:
程序:
#include <stdio.h>
void swap(int m, int n);
void main(){
int a = 10;
int b = 20;
swap(a, b);
printf("a==%d\n", a);
printf("b==%d\n", b);
}
void swap(int m, int n){
int tmp;
tmp = m;
m = n;
n = tmp;
printf("m==%d\n", m);
printf("n==%d\n", n);
}
输出:
m==20 n==10 a==10 b==20
内存示意图:
eg 2:#include <stdio.h> #include <windows.h> void testSwap02(int *m, int *n); int main(int argc, const char * argv[]) { int a = 10; int b = 20; int *p = NULL; int *q = NULL; p = &a; q = &b; printf("a==%d\n" , a); printf("b==%d\n" , b); printf("p==%d\n" , p); printf("q==%d\n" , q); testSwap02(p, q); printf("a==%d\n" , a); printf("b==%d\n" , b); printf("a==%d\n" , p); printf("b==%d\n" , q); system( "pause"); return 0; } void testSwap02(int *m , int *n){ int *tmp = NULL ; //只是交换了副本指针本身而已 tmp = m; m = n; n = tmp; printf("*m==%d\n" , *m); printf("*n==%d\n" , *n); }
内存示意图:
eg3:#include <stdio.h> #include <windows.h> void testSwap01(int *m, int *n); int main(int argc, const char * argv[]) { int a = 10; int b = 20; int *p = NULL; int *q = NULL; p = &a; q = &b; printf("a==%d\n" , a); printf("b==%d\n" , b); printf("p==%d\n" , p); printf("q==%d\n" , q); testSwap01(p, q); printf("a==%d\n" , a); printf("b==%d\n" , b); printf("a==%d\n" , p); printf("b==%d\n" , q); system( "pause"); return 0; } void testSwap01(int *m , int *n){ int tmp ; //交换副本指针指向的值 tmp = *m; *m = *n; *n = tmp; printf("*m==%d\n" , *m); printf("*n==%d\n" , *n); }
eg4:交换一级指针,也不交换a和b的值,但是交换了p和q,是*p和*q发生改变。#include <stdio.h> void testSwap03(int **m, int **n); int main(int argc, const char * argv[]) { int a = 10; int b = 20; int *p = NULL; int *q = NULL; p = &a; q = &b; int **m = &p; int **n = &q; printf("a==%d\n" , a); printf("b==%d\n" , b); printf("p==%d\n" , p); printf("q==%d\n" , q); testSwap03(m, n); printf("a==%d\n" , a); printf("b==%d\n" , b); printf("a==%d\n" , *p); printf("b==%d\n" , *q); return 0; } void testSwap03(int **m, int **n){ int *tmp = NULL; tmp = *m; *m = *n; *n = tmp; }
补:使用基本的char进行更加灵活的基本类型的交换(交换的类型必须一致,使用了指向了空类型的指针强制转换) void swap(void *p, void *q, int size){ char tmp; void *m = (char *)p; void *n = (char *)q; for(int i=0; i<size;i++){ tmp = *m; *m=*n; *n=tmp p++; q+=; } } 以上都是在stack区进行操作的。