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)

}

运行结果:

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的复制,并非原始数据。

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

最终结论:

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 8,820评论 3 44
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 8,746评论 0 6
  • 1.语言中变量的实质 要理解C指针,我认为一定要理解C中“变量”的存储实质, 所以我就从“变量”这个东西开始讲起吧...
    金巴多阅读 5,869评论 0 9
  • 2017年9月6号,农历七月十六 这一天是我的农历生日,今天我满39岁啦,四十不惑之前的最后一年,总得说点什么吧,...
    夜语婉婷阅读 3,352评论 1 0
  • 思维导图从诞生之日起,就广泛应用于各个领域。思维导图,可以让人们的思维可视化,系统化。让人的思考更加全面,系统,不...
    小树临风刘祥波阅读 19,809评论 0 1

友情链接更多精彩内容