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

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
-------------------------golang----------------------------------------------package mainimport "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=0xcf1010Call A: &m =0x7ffcf9f5de2c,&n=0x7ffcf9f5de20,n =0xcf1010After : &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.outBefore : &m=0x7ffe1e7f3058,&n=0x7ffe1e7f3050,n=0x6a3010Call A: &m =0x7ffe1e7f303c,&n=0x7ffe1e7f3030,n =0x6a3010After : &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的複製,並非未經處理資料。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.