這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
-------------------------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的複製,並非未經處理資料。