day8
1. 指针是什么?
指针是什么?
指针理解的2个要点:
-
指针是内存中一个最小单元的编号,也就是地址
-
平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量
总结:指针就是地址,口语中说的指针通常指的是指针变量
总结:
指针是用来存放地址的,地址是唯一标示一块地址空间的。
**指针的大小在32位平台是4个字节,在64位平台是8个字节。
指针类型决定了指针再被解引用的时候访问几个字节
比如: char* 的指针解引用就只能访问一个字节,而int* 的指针的解引用就能访问四个字节。
2.指针和指针类型
这里可以看到,指针的定义方式是: type + * 。 其实: char* 类型的指针是为了存放 char 类型变量的地址。 short* 类型的指针是为了存放 short 类型变量的地址。 int* 类型的指针是为了存放 int 类型变量的地址。
" #include <stdio.h> //演示实例 int main() { int n = 10; char *pc = (char*)&n; int *pi = &n; printf("%p\n", &n); printf("%p\n", pc); printf("%p\n", pc+1); printf("%p\n", pi); printf("%p\n", pi+1); return 0; } //演示实例 #include <stdio.h> int main() { int n = 0x11223344; char *pc = (char *)&n; int *pi = &n; *pc = 0; //重点在调试的过程中观察内存的变化。 *pi = 0; //重点在调试的过程中观察内存的变化。 return 0; }
总结:指针的类型决定了指针向前或者向后走一步有多大(距离)。
总结: 指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。 比如: char* 的指针解引用就只能访问一个字节,而int* 的指针的解引用就能访问四个**字节。**
3.野指针
概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
3.1 野指针成因
1.指针未初始化
#include <stdio.h> int main() { int *p;//局部变量指针未初始化,默认为随机值 *p = 20; return 0; }
2.指针越界访问
#include <stdio.h> int main() { int arr[10] = {0}; int *p = arr; int i = 0; for(i=0; i<=11; i++) { //当指针指向的范围超出数组arr的范围时,p就是野指针 *(p++) = i; } return 0; }
4.指针运算
-
指针+- 整数
-
指针-指针
-
指针的关系运算
#define N_VALUES 5 float values[N_VALUES]; float *vp; //指针+-整数;指针的关系运算 for (vp = &values[0]; vp < &values[N_VALUES];) { *vp++ = 0; }
先*vp,但没有意义,再vp++,循环为下标0~5的数组内容都为0。
标准规定: 允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与 指向第一个元素之前的那个内存位置的指针进行比较。
5.指针和数组
结论:数组名表示的是数组首元素的地址。
所以p+i 其实计算的是数组arr 下标为i的地址。