一个指针变量可以指向任何一个值的内存地址,那为何还需定义成 var strP *string 或 var intP *int 呢?

问答 BigEyeFish ⋅ 于 1周前 ⋅ 最后回复由 wilson_yang 2天前 ⋅ 64 阅读

如果一个指针变量可以指向任何一个值的内存地址,那它其实就是一个内存地址。
那么为何在定义是还需定义成:

var (
    intP *int
    strP *string
)

这种显示的定义,意义何在?

本文章首发在 GolangCaff
最佳答案
  • wilson_yang MOD
    3天前

    指针用来存放某个类型变量的地址,这个指针根据变量类型分配该变量所占的空间大小,参考 C 语言中的指针运算作类比就很快能搞清楚这个问题,例如在如下代码中:

    #include <stdio.h>
    
    int main()
    {
        int a = 127;
        void *x = &a;
        int *y = &a;
        printf("x is void type, addr is %p and next is %p\n", x, x+1);
        printf("y is int  type, addr is %p and next is %p\n",y, y+1);
        return 0;
    }

    得到的结果

    x is void type, addr is 0x7ffee087bb88 and next is 0x7ffee087bb89
    y is int  type, addr is 0x7ffee087bb88 and next is 0x7ffee087bb8c

    可以看到,指向同一地址的指针,因为类型不一样,运算之后得到的下一个地址不一样。以上例子中 void 类型的指针为变量分配了 1 个字节的空间,而 int 类型的指针为变量分配了 4 个字节的空间,所以在做加 1 运算之后,void 地址增加了1,而 int 类型的增加了 4。回到 golang 中应该也是一样的道理,如果不指明指针类型,程序如何知道你要为这个变量分配多大的空间呢?

回复数量: 4
  • kenuo 程序员是一条不归路,当我走上这条路我并不后悔,因为我认识了许多帮助我...
    1周前

    因为指针操作需要一个合法的内存地址. url

  • kenuo 程序员是一条不归路,当我走上这条路我并不后悔,因为我认识了许多帮助我...
    1周前

    你也可以直接

     p = new(int)
    *p = 666
    fmt.Println("*p = ", *p)
  • BigEyeFish
    1周前

    指针也需要一个合理的存储地址

    package main
    
    import "fmt"
    
    func main() {
        p := new(int)
        *p = 123
        fmt.Printf("p is %p, *p is %d", p, *p)
    }
  • wilson_yang MOD
    3天前

    指针用来存放某个类型变量的地址,这个指针根据变量类型分配该变量所占的空间大小,参考 C 语言中的指针运算作类比就很快能搞清楚这个问题,例如在如下代码中:

    #include <stdio.h>
    
    int main()
    {
        int a = 127;
        void *x = &a;
        int *y = &a;
        printf("x is void type, addr is %p and next is %p\n", x, x+1);
        printf("y is int  type, addr is %p and next is %p\n",y, y+1);
        return 0;
    }

    得到的结果

    x is void type, addr is 0x7ffee087bb88 and next is 0x7ffee087bb89
    y is int  type, addr is 0x7ffee087bb88 and next is 0x7ffee087bb8c

    可以看到,指向同一地址的指针,因为类型不一样,运算之后得到的下一个地址不一样。以上例子中 void 类型的指针为变量分配了 1 个字节的空间,而 int 类型的指针为变量分配了 4 个字节的空间,所以在做加 1 运算之后,void 地址增加了1,而 int 类型的增加了 4。回到 golang 中应该也是一样的道理,如果不指明指针类型,程序如何知道你要为这个变量分配多大的空间呢?

暂无评论~~
您需要登陆以后才能留下评论!

Go Web 编程

Go 编程基础(视频教程)

Go 入门指南