C/Golang中的值傳遞和指針傳遞

-------------------------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)

}

運(yùn)行結(jié)果:

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

結(jié)論:

1.調(diào)用A函數(shù)是把n的值(并非是n指向的內(nèi)容,而是指針的值)在函數(shù)內(nèi)開(kāi)辟空間復(fù)制下來(lái)。
2.A函數(shù)中的n和main中的存儲(chǔ)n的內(nèi)存地址是不一樣的,但是都是存儲(chǔ)了n的值(n是指針)。
3.A函數(shù)任何傳遞非指針、非引用的參數(shù),都會(huì)在A函數(shù)的函數(shù)棧內(nèi)開(kāi)辟空間復(fù)制這個(gè)值,如果是數(shù)組,都會(huì)復(fù)制該數(shù)組在該函數(shù),一旦退出該函數(shù),針對(duì)A函數(shù)對(duì)m的操作都會(huì)實(shí)現(xiàn),因?yàn)锳函數(shù)內(nèi)的m是對(duì)A函數(shù)參數(shù)m的復(fù)制,并非原始數(shù)據(jù)。

/*************************************************************************
        > 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;
}

運(yùn)行結(jié)果:

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

最終結(jié)論:

C和Golang中是一致的哦?。〗Y(jié)論和golang中是一致的哦?。?!***
1.調(diào)用A函數(shù)是把n的值(并非是n指向的內(nèi)容,而是指針的值)在函數(shù)內(nèi)開(kāi)辟空間復(fù)制下來(lái)。
2.A函數(shù)中的n和main中的存儲(chǔ)n的內(nèi)存地址是不一樣的,但是都是存儲(chǔ)了n的值(n是指針)。
3.A函數(shù)任何傳遞非指針、非引用的參數(shù),都會(huì)在A函數(shù)的函數(shù)棧內(nèi)開(kāi)辟空間復(fù)制這個(gè)值,如果是數(shù)組,都會(huì)復(fù)制該數(shù)組在該函數(shù),一旦退出該函數(shù),針對(duì)A函數(shù)對(duì)m的操作都會(huì)實(shí)現(xiàn),因?yàn)锳函數(shù)內(nèi)的m是對(duì)A函數(shù)參數(shù)m的復(fù)制,并非原始數(shù)據(jù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容