跳到主要内容

C 语言指针

提示
  1. 指针的基本概念:指针是C和C++编程中的强大特性,用于存储地址而不是值。
  2. 指针的声明和使用:声明指针的语法是int* p;,可以通过*运算符(解引用运算符)来访问或更改指针指向的值。
  3. 指针的常见误解:当将变量的地址分配给指针时,应使用pc = &c;而不是pc = c;*pc = &c;。正确使用指针可以避免一些常见的编程错误。

指针是C和C++编程的强大特性。在学习指针之前,让我们了解一下C编程中的地址。

C中的地址

如果您的程序中有一个变量var,&var将给出其在内存中的地址。

我们在使用scanf()函数时多次使用了地址。

scanf("%d", &var);

这里,用户输入的值存储在var变量的地址中。让我们来看一个工作示例。

#include <stdio.h>
int main()
{
int var = 5;
printf("var: %d\n", var);

// 注意在var前使用了&
printf("var的地址: %p", &var);
return 0;
}

输出

var: 5
var的地址: 2686778

注意: 当您运行上述代码时,可能会得到不同的地址。

C指针

指针(指针变量)是用来存储地址而不是值的特殊变量。

指针语法

以下是我们可以声明指针的方式。

int* p;

这里,我们声明了一个int类型的指针p。

您还可以用以下方式声明指针。

int *p1;
int * p2;

让我们来看另一个声明指针的示例。

int* p1, p2;

这里,我们声明了一个指针p1和一个普通变量p2。

向指针赋予地址

让我们来看一个示例。

int* pc, c;
c = 5;
pc = &c;

这里,5被赋予变量c。并且,c的地址被赋予pc指针。

获取指针指向的值

要获取指针指向的东西的值,我们使用*运算符。例如:

int* pc, c;
c = 5;
pc = &c;
printf("%d", *pc); // 输出:5

这里,c的地址被赋予pc指针。要获取存储在该地址的值,我们使用了*pc。

注意: 在上面的示例中,pc是一个指针,不是*pc。您不能也不应该做类似于*pc = &c的事情;

顺便说一下,*被称为解引用运算符(在处理指针时)。它作用于一个指针,并给出该指针中存储的值。

更改指针指向的值

让我们来看一个示例。

int* pc, c;
c = 5;
pc = &c;
c = 1;
printf("%d", c); // 输出:1
printf("%d", *pc); // 输出:1

我们将c的地址赋给了pc指针。

然后,我们将c的值改为1。由于pc和c的地址相同,*pc给出了1。

让我们来看另一个示例。

int* pc, c;
c = 5;
pc = &c;
*pc = 1;
printf("%d", *pc); // 输出:1
printf("%d", c); // 输出:1

我们将c的地址赋给了pc指针。

然后,我们使用*pc = 1;*pc改为1。由于pc和c的地址相同,c将等于1。

让我们来看更多示例。

int* pc, c, d;
c = 5;
d = -15;

pc = &c; printf("%d", *pc); // 输出:5
pc = &d; printf("%d", *pc); // 输出:-15

最初,使用pc = &c;将c的地址赋给了pc指针。由于c是5,*pc给出了5。

然后,使用pc = &d;将d的地址赋给了pc指针。由于d是-15,*pc给出了-15。

指针的工作示例

让我们来看一个工作示例。

#include <stdio.h>
int main()
{
int* pc, c;

c = 22;
printf("c的地址: %p\n", &c);
printf("c的值: %d\n\n", c); // 22

pc = &c;
printf("指针pc的地址: %p\n", pc);
printf("指针pc的内容: %d\n\n", *pc); // 22

c = 11;
printf("指针pc的地址: %p\n", pc);
printf("指针pc的内容: %d\n\n", *pc); // 11

*pc = 2;
printf("c的地址: %p\n", &c);
printf("c的值: %d\n\n", c); // 2
return 0;
}

输出

c的地址: 2686784
c的值: 22

指针pc的地址: 2686784
指针pc的内容: 22

指针pc的地址: 2686784
指针pc的内容: 11

c的地址: 2686784
c的值: 2

程序解释

  1. int* pc, c; 创建了一个指针变量和一个普通变量。 这里,创建了一个int类型的指针pc和一个普通变量c。 由于最初pc和c没有初始化,指针pc指向没有地址或随机地址。而变量c有一个地址,但包含随机垃圾值。

  2. c = 22; 22赋给变量c。 这将22赋予变量c。也就是说,22存储在变量c的内存位置。

  3. pc = &c; 变量c的地址赋给指针pc。 这将变量c的地址赋给指针pc。

  4. c = 11; 11赋给变量c。 这将11赋给变量c。

  5. *pc = 2; 5赋给指针变量的地址。 这将指针pc指向的内存位置的值改为2。

使用指针时的常见错误

假设,您希望指针pc指向c的地址。那么,

int c, *pc;

// pc是地址但c不是
pc = c; // 错误

// &c是地址但*pc不是
*pc = &c; // 错误

// &c和pc都是地址
pc = &c; // 不是错误

// c和*pc都是值
*pc = c; // 不是错误

以下是初学者常常感到困惑的指针语法示例。

#include <stdio.h>
int main() {
int c = 5;
int *p = &c;

printf("%d", *p); // 5
  return 0;
}

为什么使用int *p = &c;时我们没有遇到错误?

这是因为

int *p = &c;

等同于

int *p;
p = &c;

在这两种情况下,我们都是创建了一个指针p(不是*p)并将&c赋给它。

为了避免这种混淆,我们可以这样使用语句:

int* p = &c;

现在您知道了什么是指针,您将在下一个教程中学习指针与数组的关系。