C 语言指针
- 指针的基本概念:指针是C和C++编程中的强大特性,用于存储地址而不是值。
- 指针的声明和使用:声明指针的语法是
int* p;
,可以通过*
运算符(解引用运算符)来访问或更改指针指向的值。 - 指针的常见误解:当将变量的地址分配给指针时,应使用
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
程序解释
-
int* pc, c;
这里,创建了一个int
类型的指针pc和一个普通变量c。 由于最初pc和c没有初始化,指针pc指向没有地址或随机地址。而变量c有一个地址,但包含随机垃圾值。 -
c = 22;
这将22赋予变量c。也就是说,22存储在变量c的内存位置。 -
pc = &c;
这将变量c的地址赋给指针pc。 -
c = 11;
这将11赋给变量c。 -
*pc = 2;
这将指针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;
现在您知道了什么是指针,您将在下一个教程中学习指针与数组的关系。