1,入门案例
#include <stdio.h>
int main() {
int a = 3;
printf("%d\n", a);
int *b = &a;
*b = 7;
printf("%d\n", a);
return 0;
}
效果:
a从3变成了7。
2,图解过程
int a=3
变量a,值是3。
a
访问变量a
&a
访问a所指向的地址。
int* b=&a
获取a的地址,存放地址到b中。
*b
找到b中的值所指向的地址。图中3所在的方框。
*b=7
找到b中的值所指向的地址,修改数据为7。
3,指针的类型
指针有很多类型,比如:
int*
char*
double*
访问范围
不同的类型,解引用之后,能访问的字节数不同。
char*:一个字节。
int*:四个字节。
double*:八个字节。
比如:
数据是int类型,
指针是char*类型,
改动的时候只会改变一个字节。
#include <stdio.h>
int main() {
int a = 0x11223344;
printf("%x\n", a);
char *b = &a;
*b = 0;
printf("%x\n", a);
return 0;
}
效果:只有最低的一个字节被修改了。
int* 会访问四个字节大小的范围。
char* 只有一个字节。
偏移
int* b=&a
char* c=&a
指针类型加一。
表示该地址后面的一个地址。
b+1代表a指向的数据向后移动4字节。
c+1代表a指向的数据向后移动1字节。
#include <stdio.h>
int main() {
int a = 3;
int *b = &a;
char *c = &a;
printf("%p\n", b);
printf("%p\n", c);
printf("%p\n", b + 1);
printf("%p\n", c + 1);
return 0;
}
效果:
b+1:地址加4
c+1:地址加1
4,用偏移操作数组
数组名是对首个元素的指针,
数组名加一就是第二个元素。
举例:让第三个元素的值加123。
#include <stdio.h>
int main() {
int arr[] = {
1, 2, 3, 4, 5, 6, 7};
*(arr + 2) += 123;
printf("%d\n", arr[2]);
return 0;
}
效果:3+123=126
5,野指针
野指针:指针,但是指向奇怪的地方。
野指针会导致大部分的Bug。
常见的几种野指针:
- 未初始化的指针。
- 数组越界之后的指针。
- 数据已经不在生命周期的指针。