loading

探索 C 语言的指针

指针的概念

指针代表一个变量的内存地址,通过&可以拿到变量的内存地址。变量不等于指针,通过*可以拿到指针所指向的变量的值。

在 C 中,存在指针变量,指针变量的声明格式:int* varName = &varAddress。声明指针变量之后,通过*可以拿到该指针变量所指向的值。例如,feet 变量是一个int类型,指针变量的类型也是int

int main(void)
{
  int feet = 10; // int 类型的变量
  int* pfeet = &feet; // 指针变量,与 feet 数据类型一样

  printf("before updating feet is %d\n", feet); // before updating feet is 10
  *pfeet += 10; // 通过 * 拿到指针变量所指向的值
  printf("now feet is %d\n", feet); // now feet is 20
  return 0;
}

指针的作用

因为函数作用域的影响,局部变量只能存在于一个函数作用域内使用,一个函数传递它的局部变量给另一个函数,这个变量的地址会变化,也就是变量不是同一个。如果想“穿透”作用域带来的这种限制,考虑使用指针。

void change(int, int); // 声明一个函数

int main(void)
{
  int x = 10, y = 5; // 声明 main 函数的局部变量
  change(x, y); // 传递局部变量,main 函数的 x、y 和 change 的 x、y 地址不相同
  printf("[3] x = %d, y = %d\n", x, y);
  return 0;
}

void change(int x, int y)
{
  printf("[1] x = %d, y = %d\n", x, y);
  x = 20;
  y = 10;
  printf("[2] x = %d, y = %d\n", x, y);
}

在 main 函数中声明的两个局部变量,change 函数的变量由 main 传递,但实际上 x 和 y 的地址都不一样。main 函数修改 x 或 y,不会影响 change 函数内的 x 或 y。而传递指针,就能够穿透“作用域”,改变上述问题。

指针指向的是内存地址,只要拿到内存地址,找到门牌号,就能修改变量的值。下面通过指针来修改 main 函数的 x 和 y:

void change(int*, int*); // 声明指针变量,传递变量的内存地址

int main(void)
{
  int x = 10, y = 5;
  change(&x, &y); // 传递内存地址,而不是变量
  printf("[3] x = %d, y = %d. x Address = %p, y Address = %p\n", x, y, &x, &y);
  return 0;
}

void change(int* x, int* y)
{
  printf("[1] x = %d, y = %d. x Address = %p, y Address = %p\n", *x, *y, x, y);
  *x = 20;
  *y = 10;
  printf("[2] x = %d, y = %d. x Address = %p, y Address = %p\n", *x, *y, x, y);
}

change 函数接收的是一个指针,函数找到内存地址所对应的变量(通过*拿到内存所指向的变量值),修改其指针所指向的变量值,main 函数的 x 和 y 也随着改变:

posted @ 2022-09-15 11:47  Himmelbleu  阅读(24)  评论(0编辑  收藏  举报