C语言的值传递

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区进行操作的。
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值