C 指针
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);
// Notice the use of & before var
printf("address of var: %p", &var);
return 0;
}
输出
var: 5 address of var: 2686778
注意: 运行上面的代码,你可能会得到一个不同的地址。
C 指针
指针(指针变量)是特殊变量,用于存储地址而不是值。
指针语法
下面是我们如何声明指针。
int* p;
在这里,我们声明了一个指针 p int
输入。
您也可以通过这些方式声明指针。
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); // Output: 5
这里,c
的地址 分配给 pc 指针。为了获取存储在该地址中的值,我们使用了 *pc .
注意: 在上面的例子中,pc 是一个指针,而不是 *pc
.你不能也不应该做像 *pc = &c
这样的事情;
顺便说一句,*
被称为解引用运算符(使用指针时)。它对指针进行操作并给出存储在该指针中的值。
指针指向的改变值
举个例子吧。
int* pc, c;
c = 5;
pc = &c;
c = 1;
printf("%d", c); // Output: 1
printf("%d", *pc); // Ouptut: 1
我们已经分配了 c 的地址 到 pc 指针。
然后,我们改变了 c 的值 到 1. 由于 pc 以及 c 的地址 一样,*pc
给我们1。
我们再举一个例子。
int* pc, c;
c = 5;
pc = &c;
*pc = 1;
printf("%d", *pc); // Ouptut: 1
printf("%d", c); // Output: 1
我们已经分配了 c 的地址 到 pc 指针。
然后,我们更改了 *pc
使用 *pc = 1;
为 1 .由于 pc 以及 c 的地址 是一样的,c 将等于 1。
我们再举一个例子。
int* pc, c, d;
c = 5;
d = -15;
pc = &c; printf("%d", *pc); // Output: 5
pc = &d; printf("%d", *pc); // Ouptut: -15
最初,c 的地址 分配给 pc 使用 pc = &c;
的指针 .由于 c 是 5,*pc
给我们5。
然后,d的地址 分配给 pc 使用 pc = &d;
的指针 .由于 d 是 -15,*pc
给我们-15。
示例:指针的工作
让我们举一个实际的例子。
#include <stdio.h>
int main()
{
int* pc, c;
c = 22;
printf("Address of c: %p\n", &c);
printf("Value of c: %d\n\n", c); // 22
pc = &c;
printf("Address of pointer pc: %p\n", pc);
printf("Content of pointer pc: %d\n\n", *pc); // 22
c = 11;
printf("Address of pointer pc: %p\n", pc);
printf("Content of pointer pc: %d\n\n", *pc); // 11
*pc = 2;
printf("Address of c: %p\n", &c);
printf("Value of c: %d\n\n", c); // 2
return 0;
}
输出
Address of c: 2686784 Value of c: 22 Address of pointer pc: 2686784 Content of pointer pc: 22 Address of pointer pc: 2686784 Content of pointer pc: 11 Address of c: 2686784 Value of c: 2
程序说明
int* pc, c;
这里,一个指针 pc 和一个普通变量 c , 均为int
类型 , 被建造。
由于 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 is address but c is not
pc = c; // Error
// &c is address but *pc is not
*pc = &c; // Error
// both &c and pc are addresses
pc = &c; // Not an error
// both c and *pc values
*pc = c; // Not an error
这是一个指针语法的例子,初学者经常会感到困惑。
#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;
现在你知道什么是指针了,下个教程你会学习指针与数组的关系。
C语言