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

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

var (
    intP *int
    strP *string
)

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

最佳答案

指针用来存放某个类型变量的地址,这个指针根据变量类型分配该变量所占的空间大小,参考 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个月前
讨论数量: 6
JeffreyBool

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

4个月前
JeffreyBool

你也可以直接

 p = new(int)
*p = 666
fmt.Println("*p = ", *p)
4个月前

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

package main

import "fmt"

func main() {
    p := new(int)
    *p = 123
    fmt.Printf("p is %p, *p is %d", p, *p)
}
4个月前

指针用来存放某个类型变量的地址,这个指针根据变量类型分配该变量所占的空间大小,参考 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个月前

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

3个月前

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

3个月前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!