目录
1:指针是什么
地址指向了一个具体的内存单元,所以地址又叫做指针,因此指针就是地址,地址就是指针
指针是一个变量,用来存放内存单元的地址
p是用来存放a的地址(指针)的,因此p是一个指针变量
#include<stdio.h>
int main() {
int a = 10;
int* p = &a;
printf("%p\n", p);
}
2:指针的大小
一个内存单元的大小是1个字节
而指针是地址,地址是二进制序列(32位有32个,64位有64个),一个地址的大小是32个比特,也就是4个字节,因此指针变量的的大小是4个字节,同理在64位系统下的指针变量的大小是8个字节
3:指针变量的类型决定了什么
3.1:决定了指针解引用的时候一次能够访问几个字节
如整形指针解引用一次可以访问4个字节
字符型指针一次可以访问1个字节
#include<stdio.h>
int main() {
int a = 0x11223344;
int* pa = &a;
char* pb = (char*)&a;
*pa = 0;//一次访问四个字节
*pb = 0;//一次访问一个字节
printf("%d\n" ,* pa);
printf("%d\n", *pb);
}
3. 2:决定了指针在+-整数的时候跳过的字节数
#include<stdio.h>
int main() {
int a = 10;
int* pa = &a;
char* pb =(char*) &a;
printf("%p\n", pa);
printf("%p\n", pb);
printf("%p\n", pa+1);
printf("%p\n", pb+1);
}
4:野指针
4.1野指针形成的原因
●指针变量没有初始化
#include<stdio.h>
int main() {
int* p;//指针变量p没有初始化
*p = 20;
return 0;
}
●指针越界访问
#include<stdio.h>
int main() {
int arr[10];
int* p = arr;
for (int i = 0; i < 13; i++) {
*(p + i) = 1;
}
return 0;
}
●指针指向的空间已经被释放
#include<stdio.h>
int* test() {
int a = 20;
return &a;
}
int main() {
int* p = test();
*p = 10;//这里的p为野指针,因为指向的空间在函数执行后已经还给了操作系统,
//指向的空间不属于该程序
printf("%d\n", *p);
}
4.2:避免野指针
●指针初始化
●避免越界访问你
●避免指针指向局部变量的地址
●指针指向的空间释放后指针置为NULL
●使用指针之前判断其是否有效
#include<stdio.h>
int main() {
int* p = NULL;
if (p != NULL) {//判断指针的有效性
*p = 20;
}
return 0;
}
5:简单引一下栈区
栈区的地址是由高到低使用的
#include<stdio.h>
int main() {
int a = 10;
int b = 20;
printf("%p\n", &a);
printf("%p\n", &b);
}