文章发布于:2024年1月19日

声明一个指针:

int* p;

假如要将指针指向一个整数变量,该怎么做呢?

int* p;
int n = 10;
*p = n;

直觉上应该这样写,但这是不对的,正确的应该这样:

int* p;
int n;
p = &n;
*p = 10;

因为在指针被声明时,指向是随机的。第一种方法,当执行 *p = n 时,此时相当于在指针 p 随机指向的位置,赋予变量 n,这可能引起问题。在第二种例子,通过 &n 操作取得变量地址,然后指针指向这个地址,这样再执行 *p = 10 操作时,相当于通过指针 p,对变量 n 进行赋值操作。

所以,对于指针 p,所谓“指向”操作,就是通过赋值形式完成的。

int* p;
int n;
1) p = n   //报错,因为指针只能指向地址,不能指向变量本身
2) p = &n  //& 符号用于获得变量地址,然后再指向
3) *p = n  //相当于将指针p指向的地址,写入变量n
4) *p = &n //报错,相当于将指针p指向的地址,写入地址,而指针p是整数类型,类型不符,也无法转换。

在C语言中,函数传递值是复制转递的,也就是说,函数内部的操作,不会影响外部变量。但通过指针,则可以改变外部变量。

int add_1(int* n) {
  *n = *n + 1;
}int main(void) {
  int n = 1;
  add_1(&n);
  printf("%d", n); // 2
}