您的位置:首页 > 编程语言 > Go语言

C/Golang中的值传递和指针传递

2016-09-23 17:18 330 查看
-------------------------golang----------------------------------------------
package main

import "fmt"

func A(m int, n []int) {
m = 100
n[0] = 99
fmt.Printf("After : &m=%p,&n=%p,n=%p\n", &m, &n, n)
fmt.Printf("         m=%d,n=%v\n", m, n)
}
func main() {
m := 300
n := []int{1, 2, 3}
fmt.Printf("-----------origin--------------------\n")
fmt.Printf("Befter : &m=%p,&n=%p,n=%p\n", &m, &n, n)
fmt.Printf("          m=%d,n=%v\n", m, n)
fmt.Printf("-----------call A--------------------\n")
A(m, n)
fmt.Printf("------------end-------------------\n")
fmt.Printf("End : &m=%p,&n=%p,n=%p\n", &m, &n, n)
fmt.Printf("      m=%d,n=%v\n", m, n)

}


运行结果:

Before : &m=0x7ffcf9f5de48,&n=0x7ffcf9f5de40,n=0xcf1010
Call A: &m =0x7ffcf9f5de2c,&n=0x7ffcf9f5de20,n =0xcf1010
After : &m=0x7ffcf9f5de48,&n=0x7ffcf9f5de40,n=0xcf1010


结论:

1.调用A函数是把n的值(并非是n指向的内容,而是指针的值)在函数内开辟空间复制下来。
2.A函数中的n和main中的存储n的内存地址是不一样的,但是都是存储了n的值(n是指针)。
3.A函数任何传递非指针、非引用的参数,都会在A函数的函数栈内开辟空间复制这个值,如果是数组,都会复制该数组在该函数,一旦退出该函数,针对A函数对m的操作都会实现,因为A函数内的m是对A函数参数m的复制,并非原始数据。


--------------------------------C------------------------------------
/*************************************************************************
> File Name: test.c
> Author: perrynzhou
> Mail: 715169549@qq.com
> Created Time: Sat 24 Sep 2016 02:21:00 AM HKT
************************************************************************/

#include <stdio.h>
#include <stdlib.h>
void A(int m,int *n)
{
m =100;
n[0]=300;
fprintf(stdout,"Call A: &m =%p,&n=%p,n =%p\n",&m,&n,n);
}
int main(void)
{
int m = 30;
int size = 3,i;
int *n = (int *)malloc(sizeof(int)*size);
n[0] = 99;
n[1] = 6;
n[2] = 88;
fprintf(stdout,"Before : &m=%p,&n=%p,n=%p\n",&m,&n,n);
A(m,n);
fprintf(stdout,"After : &m=%p,&n=%p,n=%p\n",&m,&n,n);
if(n != NULL){
free(n);
n=NULL;
}
return 0;
}


运行结果:

$ ./a.out
Before : &m=0x7ffe1e7f3058,&n=0x7ffe1e7f3050,n=0x6a3010
Call A: &m =0x7ffe1e7f303c,&n=0x7ffe1e7f3030,n =0x6a3010
After : &m=0x7ffe1e7f3058,&n=0x7ffe1e7f3050,n=0x6a3010


最终结论:

***和Golang中是一致的哦!!结论和golang中是一致的哦!!!***
1.调用A函数是把n的值(并非是n指向的内容,而是指针的值)在函数内开辟空间复制下来。
2.A函数中的n和main中的存储n的内存地址是不一样的,但是都是存储了n的值(n是指针)。
3.A函数任何传递非指针、非引用的参数,都会在A函数的函数栈内开辟空间复制这个值,如果是数组,都会复制该数组在该函数,一旦退出该函数,针对A函数对m的操作都会实现,因为A函数内的m是对A函数参数m的复制,并非原始数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息