void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  Serial.println("Hello, ESP32-S3!");

  uint16_t val_a = 10;    // 定义一个变量
  uint16_t val_b = 20;    // 定义第二个变量

  uint16_t *val_p = &val_a;   // 声明一个指针,这里可以不赋值,而&val_a 表示将变量 val_a 的地址付给这个指针
  val_p = &val_b;             // 指针类型的是可以二次赋值的
  uint16_t &val_c = val_b;    // 引用类型的变量相当于给变量起了个别名,他们的地址是相同的

  printf(" val_a= %d\n", val_a);
  printf(" val_b= %d\n", val_b);
  printf(" val_p= 0x%X\n", val_p);    // val_p 的值是val_b 的地址
  printf("&val_p= 0x%X\n", &val_p);   // 但val_p的地址和val_b是不同的

  printf("&val_b= 0x%X\n", &val_b);   // val_b 的地址和 val_c的地址是相同的
  printf("&val_c= 0x%X\n", &val_c);
  printf(" val_b= %d\n", val_b);
  printf(" val_c= %d\n", val_c);      // val_b的值和val_c的值也是相同的

}

void loop() {
  // put your main code here, to run repeatedly:
  delay(10); // this speeds up the simulation
}

void printf(String format, ...) {
  char buffer[128]; // 创建缓冲区
  va_list args; // 定义可变参数列表
  va_start(args, format); // 初始化可变参数列表
  vsnprintf(buffer, sizeof(buffer), format.c_str(), args); // 格式化输出到缓冲区
  va_end(args); // 结束可变参数列表
  Serial.print(buffer); // 输出到串口
}
esp:0
esp:1
esp:2
esp:3
esp:4
esp:5
esp:6
esp:7
esp:8
esp:9
esp:10
esp:11
esp:12
esp:13
esp:14
esp:15
esp:16
esp:17
esp:18
esp:19
esp:20
esp:21
esp:35
esp:36
esp:37
esp:38
esp:39
esp:40
esp:41
esp:42
esp:45
esp:46
esp:47
esp:48
esp:3V3.1
esp:3V3.2
esp:RST
esp:5V
esp:GND.1
esp:GND.2
esp:TX
esp:RX
esp:GND.3
esp:GND.4