跳到主要内容

指针

C 语言

char *string;

表示声明一个指向字符(或字符数组)的指针变量。

声明时并没有对其初始化。因此需要对其进行初始化

string = "Hello, World!";
string = malloc(20); // 分配 20 字节的内存,并将首个字节的内存地址存放到 string 变量中

free(string); // malloc 手动分配的内存必须使用 free 释放
// 声明一个指向不确定类型的指针
void *node;

// *p 取出指针变量 p 所指向的内存地址里面的值
void increment(int* p) {
*p = *p + 1;
}
c 语言函数传参,除了数组和指针外,其余都是值传递(即传入的是一个副本), 因此,引用传递更高效。* *这一点,go 与 c 保持一致。**
#include <stdio.h>

typedef struct {
int a;
int b;
} MyStruct;

void modifyStruct(MyStruct s) {
s.a = 10; // 仅修改副本,不会影响外部的结构体
}

int main() {
MyStruct myStruct = {1, 2};
modifyStruct(myStruct);
printf("a: %d, b: %d\n", myStruct.a, myStruct.b); // 输出 a: 1, b: 2
return 0;
}

& 运算符

& 运算符用来取出一个变量所在的内存地址。

& 运算符与 * 运算符互为逆运算

go

var ip *int
var fp *float32
package main

import "fmt"

func main() {
var a int= 20 /* 声明实际变量 */
var ip *int /* 声明指针变量 */

ip = &a /* 指针变量的存储地址 */

fmt.Printf("a 变量的地址是: %x\n", &a )

/* 指针变量的存储地址 */
fmt.Printf("ip 变量储存的指针地址: %x\n", ip )

/* 使用指针访问值 */
fmt.Printf("*ip 变量的值: %d\n", *ip )
}