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

问答 BigEyeFish ⋅ 于 2个月前 ⋅ 最后回复由 feiffy 4周前 ⋅ 221 阅读

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

var (
    intP *int
    strP *string
)

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

本文章首发在 GolangCaff
最佳答案
  • 指针用来存放某个类型变量的地址,这个指针根据变量类型分配该变量所占的空间大小,参考 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 中应该也是一样的道理,如果不指明指针类型,程序如何知道你要为这个变量分配多大的空间呢?

    1个月前 1
回复数量: 6
  • kenuo golang工程师 @ 智车优行 (北京) 科技有限公司

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

    2个月前
  • kenuo golang工程师 @ 智车优行 (北京) 科技有限公司

    你也可以直接

     p = new(int)
    *p = 666
    fmt.Println("*p = ", *p)
    2个月前
  • 指针也需要一个合理的存储地址

    package main
    
    import "fmt"
    
    func main() {
        p := new(int)
        *p = 123
        fmt.Printf("p is %p, *p is %d", p, *p)
    }
    2个月前
  • 指针用来存放某个类型变量的地址,这个指针根据变量类型分配该变量所占的空间大小,参考 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 中应该也是一样的道理,如果不指明指针类型,程序如何知道你要为这个变量分配多大的空间呢?

    1个月前 1
  • @BigEyeFish 那为什么我们不直接去操作值呢 ? 而是要麻烦一步,去操作指针

    1个月前
  • @梦里曾经与画眉 有的值比如一个结构体这样的复杂的变量,直接操作它比如传参给函数,就会复制这个值一次,而传指针的,只需要复制一个指针(4个字节/8个字节),性能消耗比较小。

    4周前
您需要登陆以后才能留下评论!

GORM 中文文档

Gin 框架中文文档

Iris 框架中文文档

Go 简易教程

Go Web 编程

Go 编程基础(视频教程)

Go 入门指南