返回

指针就该这样学,看完这一篇,无需再为指针苦恼!

后端

什么是指针?

指针是一种数据类型,它可以存储另一个变量的地址。这意味着指针可以用来指向任何类型的变量,包括整数、字符、数组等等。

指针的语法如下:

type *pointer_name;

其中,type是所指变量的类型,pointer_name是指针的名称。

例如,以下代码声明了一个指向整数变量的指针:

int *p;

左值和右值

在理解指针之前,我们需要先了解一下左值和右值。

左值是指可以出现在赋值语句左边的变量或表达式。例如,以下变量都是左值:

int a;
char b;

右值是指只能出现在赋值语句右边的常量或表达式。例如,以下常量和表达式都是右值:

10
"hello"

指针的应用

指针可以用来做很多事情,包括:

  • 访问数组元素
  • 传递函数参数
  • 返回函数值
  • 动态分配内存

访问数组元素

指针可以用来访问数组元素。例如,以下代码使用指针来访问数组a的第一个元素:

int a[10];
int *p = &a[0];
*p = 10;

传递函数参数

指针可以用来传递函数参数。例如,以下函数接受一个指向整数数组的指针作为参数:

void func(int *p) {
  for (int i = 0; i < 10; i++) {
    p[i] = i;
  }
}

返回函数值

指针可以用来返回函数值。例如,以下函数返回一个指向整数数组的指针:

int *func() {
  int a[10];
  for (int i = 0; i < 10; i++) {
    a[i] = i;
  }
  return a;
}

动态分配内存

指针可以用来动态分配内存。例如,以下代码使用malloc函数动态分配一块内存,并返回指向这块内存的指针:

int *p = malloc(10 * sizeof(int));

指针与数组

指针和数组密切相关。数组实际上就是一组连续的内存地址,而指针可以用来访问这些内存地址。

以下是一些指针与数组的常见用法:

  • 数组名可以作为一个指针使用。例如,以下代码声明了一个指向数组a的指针:
int *p = a;
  • 指针可以用来访问数组元素。例如,以下代码使用指针p来访问数组a的第一个元素:
*p = 10;
  • 数组元素也可以作为一个指针使用。例如,以下代码将数组a的第一个元素作为参数传递给函数func
func(a[0]);

指针函数

指针函数是指以指针为参数或返回值的函数。

以下是一些指针函数的常见用法:

  • 将函数指针作为参数传递给另一个函数。例如,以下代码将函数func的指针作为参数传递给函数g
void g(void (*func)(int)) {
  func(10);
}
  • 将函数指针作为返回值返回。例如,以下函数返回一个指向函数func的指针:
void (*func)() {
  return func;
}
  • 使用函数指针来实现回调函数。例如,以下代码使用函数指针来实现一个回调函数,该回调函数在另一个函数执行完成后被调用:
void func(void (*callback)(void)) {
  // do something
  callback();
}

总结

指针是 C 语言中非常重要的一个概念,它可以用来做很多事情,包括访问数组元素、传递函数参数、返回函数值、动态分配内存等等。

掌握了指针,就可以更好地理解 C 语言的底层机制,并编写出更强大的程序。