在计算机科学中,指针是编程语言中的一个对象,利用地址,他的值直接指向存在于电脑存储器中的另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能够找到以它作为地址的内存单元。
我们可以这样理解
| 内存 | |
| 一个字节 | 0xFFFFFFFF |
| 一个字节 | 0xFFFFFFFE |
| ....... | ... |
| ....... | ... |
| 一个字节 | 0x00000002 |
| 一个字节 | 0x00000001 |
| 一个字节 | 0x00000000 |
总结 :#include
int main() {
int a = 10;
int *p = &a; //指针变量 - 存放地址的变量叫做指针变量。
return 0;
}
指针就是变量,用来存放地址的变量。(存放在指针中的值都被当成地址处理)。
二. 指针和指针类型- 为什么要有指针类型?
指针类型决定了指针进行解引用操作的时候,能够访问空间的大小 。
int*p; *p 能够访问 4个字节。
char*p; *p 能够访问 1个字节。
double*p; *p 能够访问 8个字节。
例如:
int main(){
int a = 0x11223344;
int* pa = &a;
*pa = 0;
return 0;
}
其中,在计算机运行
int a = 0x11223344;
int* pa = 0;
以后, a在计算机存储的情况为:
a - 0x11223344
其中 0x11223344 分为 4 个字节 分别是 11 22 33 44。
而通过调用指针变量 *pa 来操作 a 的内容。 在计算机运行
*pa = 0;
以后。a 在计算机内的存储情况变成了:
a - 0x00000000
由此可见,int* pa 改变了该地址变量指向地址的内存的四个字节的空间的内容。即访问了该地址的四个字节的内容。
如果把上述代码中的 int 换成 char:
int main() {
int a = 0x11223344;
char* pc = &a;
*pc = 0;
return 0;
}
其中,在计算机运行
int a = 0x11223344;
char* pc = 0;
以后, a在计算机存储的情况为:
a - 0x11223344
其中 0x11223344 分为 4 个字节 分别是 11 22 33 44。
而通过调用指针变量 *pa 来操作 a 的内容。 在计算机运行
*pa = 0;
以后。a 在计算机内的存储情况变成了:
a - 0x00223344
显而易见,char* pa 改变了该地址变量指向地址的内存的一个字节的空间的内容。即访问了该地址的一个字节的内容。
总结:指针的类型决定了,对指针解引用的时候有多大的权限(即能操作几个字节)。比如:char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。
- 不同类型的指针对步长的影响:
先看代码和运行结果:
int main() {
int a = 0x11223344;
int* pa = &a;
char* pc = &a;
printf("%pn", pa);
printf("%pn", pa+1);
printf("%pn", pc);
printf("%pn", pc+1);
return 0;
}
其中 int* pa 和 char* pc 的地址相同。但是 int*(pa+1) 和 char*(pc+1)所打印出来的地址缺却不一样。
其原因是:在 int*(pa+1)中 pa 加的 1 是int的四个字节,而 char*(pc+1)中 pc 加的 1 是char的一个字节。
总结:指针类型决定了指针向前或向后走一步有多大。(指针的步长)(单位是字节)
int* p; p+1 --> 4
char* p; p+1 --> 1
double* p; p+1 --> 8
三. 野指针概念: 野指针就是指针指向的位置是不可知的(随机的·不正确的·没有明确限制的)。
- 野指针成因
1.指针未初始化 —— 创建的局部的指针变量,被初始化随机值
int main() {
int* p;
*p = 20;
return 0;
}
2.指针越界访问 —— 当指针指向的范围超过数组 arr 的范围时,p 就是野指针。
#includeint main() { int arr[10] = {0}; int *p = arr; int i = 0; for(i=0; i<=11; i++) { // 当指针指向的范围超过数组 arr 的范围时,p 就是野指针。 *(p++) = i; } return 0; }
3.指针指向的内存空间释放 —— 指针指向的临时变量被释放等...
int *text()
{
int a = 10;
return &a;
}
int main()
{
int *p = test();
*p = 20;
return 0;
}
- 如何规避野指针
- 指针初始化。
- 小心指针越界。
- 指针指向空间释放即使置NULL。
- 指针使用之前检查有效性。



