指针
本章小编偷个懒,把md文档导入了哈哈哈!
1.指针基本理解
1.1指针理解的2个要点:
- 指针是内存中一个最小单元的编号,也就是地址。
- 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量。
总结:指针就是地址,口语中说的指针通常指的是指针变量。
3.指针变量
我们可以通过**&(取地址操作符)**取出变量的内存其实地址,把地址可以存放到一个变量中,这个
变量就是指针变量
#include <stdio.h> int main() { int a = 10;//在内存中开辟一块空间 int *p = &a;//这里我们对变量a,取出它的地址,可以使用&操作符。此处*定义指针变量p //a变量占用4个字节的空间,这里是将a的4个字节的第一个字节的地址存放在p变量 //中,p就是一个之指针变量。 return 0; }
总结:
指针变量,用来存放地址的变量。(存放在指针中的值都被当成地址处理)。
指针是用来存放地址的,地址是唯一标示一块地址空间的。
指针的大小在32位平台是4个字节,在64位平台8个字节
2. 指针和指针类型
2.1指针类型
我们都知道,变量有不同的类型,整形,浮点型等。那指针有没有类型呢?
准确的说:有的。
当有这样的代码:
int num=10; p=&num
要将&num(num的地址)保存到p中,我们知道p就是一个指针变量,那它的类型是怎样的呢?
我们给指针变量相应的类型。
char *pc = NULL; int *pi = NULL; short *ps = NULL; long *pl = NULL; float *pf = NULL; double *pd = NULL; ......
这里可以看到,指针的定义方式是: type + * 。
其实:
char* 类型的指针是为了存放 char 类型变量的地址。
short* 类型的指针是为了存放 short 类型变量的地址。
int* 类型的指针是为了存放 int 类型变量的地址。
2.2指针类型的影响
2.2.1 指针±整数
#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; } 运行结果: 000000000065FE0C 000000000065FE0C 000000000065FE0D 000000000065FE0C 000000000065FE10
**总结:**指针的类型决定了指针向前或者向后走一步有多大(距离)。
2.2.2指针的解引用
#include <stdio.h> int main() { int n = 0x11223344; char *pc = (char *)&n; int *pi = &n; *pc = 0; //重点在调试的过程中观察内存的变化。 *pi = 0; //重点在调试的过程中观察内存的变化。 return 0; }
#include <stdio.h> int main() { int n = 0x11223344; // 初始化一个整数变量n char *pc = (char *)&n; // 将n的地址强制转换为字符类型指针并赋值给pc *pc = '0'; // 将pc指向的地址的值设为0 printf("%c", *pc); // 打印修改后的字符,使用正确的%c格式说明符 printf("%c", n) ; // 打印变量n的值 int *pd=&n; *pd=1; //此时*解引用 printf("%d",n); return 0; }运行结果:001
总结:
指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。
比如: char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。
3.野指针
概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
3.1 野指针成因
3.1.1指针未初始化
#include <stdio.h> int main() { int *p;//局部变量指针未初始化,默认为随机值 *p = 20; return 0; }
3.1.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; }
3.1.3指针指向的空间释放
#include <stdio.h> int* test() { int n = 100; return &n; } int main() { int*p = test(); printf("%d\n", *p); return 0; }
函数结束后,申请的空间还给操纵系统了,p指针就会进行非法访问,成为了野指针。