1.什么是指针Pointers
指针就是内存地址
。我们可以通过这个内存地址获取到对应变量的值,并可以进行修改。也就是说指针(变量)就是存着内存地址的变量,就是说指针也是一种变量。
2.指针的定义
格式:
c
数据类型 * 变量名
- 数据类型要跟该指针指向的数据类型一致。
比如指向的是整形类型:
cint* p1; float* p2;
*
没有别的意义,就是一种标记,表示该变量是指针变量。
注意:不能把一个数值赋值给指针变量,比如下面这种写法是错误的:
c
int* p = 500;
这种写法意味着指针把这个500当作内存地址来处理,这样随便分配内存地址是不对的。
3.指针的作用
- 查询数据
- 存储数据
- 参数传递
- 内存管理
- 等等。。。
①查询数据
我们可以通过指针查询数据:
c
#include<stdio.h>
int main() {
int a = 10;
// 把变量a的内存地址给指针变量p,因为指针就是存储内存地址的变量
// 指针p就指向了变量a
int* p = &a;
// 这里的 * 是解引用运算符,就是获取p存储的内存地址里面的变量
printf("%d", *p);
return 0;
}
输出:10
比如如果我们直接输出p
,输出的是a的内存地址:
c
#include<stdio.h>
int main() {
int a = 10;
int* p = &a;
printf("%d\n", &a);
printf("%d", p);
return 0;
}
输出:
text
-2004878924
-2004878924
②操作其它函数中的变量
比如交换两个变量的值,如果要求定义一个自定义函数swap
来完成两个变量值的交换,应该怎么写呢?
应该这样写:
c
#include<stdio.h>
void swap(int* p1, int* p2);
int main() {
int a,b;
printf("输入a:");
scanf("%d", &a);
printf("输入b:");
scanf("%d", &b);
swap(&a, &b);
printf("a=%d\n", a);
printf("b=%d\n", b);
return 0;
}
void swap(int* p1, int* p2) {
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
需要注意的小细节:
函数调用结束以后,该函数里面的所有变量都会销毁。用自定义函数返回一个指针,如果这样写:
c
#include<stdio.h>
int* method();
int main() {
int* p = method();
printf("拖延一点时间...\n");
printf("拖延一点时间...\n");
printf("拖延一点时间...\n");
printf("拖延一点时间...\n");
printf("%d\n", *p);
return 0;
}
int* method() {
int a = 10;
return &a;
}
这段代码不能打印出*p
的值,因为该指针指向的变量已经被销毁。
我们可以使用static
来解决这个问题:
c
#include<stdio.h>
int* method();
int main() {
int* p = method();
printf("拖延一点时间...\n");
printf("拖延一点时间...\n");
printf("拖延一点时间...\n");
printf("拖延一点时间...\n");
printf("%d\n", *p);
return 0;
}
int* method() {
// 加上static关键字
static int a = 10;
return &a;
}
static
关键字可以延长变量的生命周期,使得这个变量在整个程序结束之前不会被销毁。