如何 html5 网站模板,网站优化软件下载,书店网站建设设计方案,建企业网站教程指针一、什么是指针二、指针类型三、指针和数组的关系四、空指针五、野指针一、什么是指针
指针#xff08;Pointer#xff09;是编程语言中的一个对象#xff0c;通过地址直接指向内存中该地址的值。由于通过地址能够找到所需的变量存储单元#xff0c;可以说地址指向该变…
指针一、什么是指针二、指针类型三、指针和数组的关系四、空指针五、野指针一、什么是指针
指针Pointer是编程语言中的一个对象通过地址直接指向内存中该地址的值。由于通过地址能够找到所需的变量存储单元可以说地址指向该变量存储单元因此将地址形象化称为指针。总而言之指针就是变量存放内存单元的地址存放在指针中的值都会被当作地址处理。
#include stdio.h
int main(){int a 5; // 在内存中开辟一块存储空间存放变量a的值5int* p a; // 取出变量a的地址存放在变量p中p就是一个指针变量// int* p;// p a;return 0;
}如下图所示 此时在内存中开辟一块存储空间存放变量a的值5同时定义了一个指针变量p将变量a的地址赋给指针变量p此时指针变量p内存放的就是变量a的地址通过*p即可访问到指针变量p指向地址的数据即 *p 的值为 5 。
二、指针类型
所有实际数据类型不管是整型、浮点型、字符型还是其他的数据类型对应指针的值的类型都是一样的都是一个代表内存地址的长的十六进制数。不同数据类型的指针之间唯一的不同是指针所指向的变量或常量的数据类型不同。 1、指针类型决定了指针进行解引用操作的时候能够访问空间的大小。 int* p;* p能够访问4个字节 char* p; * p能够访问1个字节 double* p; *p能够访问8个字节
2、指针类型决定了指针的步长。例如
#include stdio.h
int main(){int a 5; int* pa a;char* pc a; printf(pa %p\n,pa);printf(pa1 %p\n,pa1);printf(pc %p\n,pc);printf(pc1 %p\n,pc1);return 0;
}此时定义了3个类型的指针分别为char *、int *、double *分别对其进行加1操作结果如下 此时int *类型的指针加1操作的步长为4char * 类型的指针操作步长为1double * 类型的指针操作步长为8。
三、指针和数组的关系
数组名即该数组首元素的地址即数组名就是一个指针。
#include stdio.h
int main(){int arr[5] {1,2,3,4,5};int *p arr; // 数组名即该数组首元素arr[0]的地址for (int i 0; i 5; i){printf(%d ,*(pi));} printf(\n);for (int i 0; i 5; i){printf(%d ,*(arri));} return 0;
}运行结果
四、空指针
在指针声明的时候如果没有确切的地址可以赋值为指针变量赋一个 NULL 值是一个良好的编程习惯。赋为 NULL 值的指针被称为空指针。
#include stdio.h
int main(){int* p NULL;printf(p的地址是%p,p);return 0;
}五、野指针
野指针就是指针指向的位置是不可知的随机的、不正确的、没有明确限制的。 1、野指针形成原因 1指针未初始化 例如
#include stdio.h
int main(){int a; // 局部变量不初始化默认是随机值int* p; // 局部指针变量未进行初始化默认为随机值*p 20;return 0;
}2指针越界访问 例如
#include stdio.h
int main(){int arr[5] {0};int* p arr;for (int i 0; i 5; i){// 当i 5时指针的范围超出了数组arr的范围时p就是野指针*(p) i;}return 0;
}当i 5时指针的范围超出了数组arr的范围时p就是野指针。 3指针指向的空间释放 例如
#include stdio.hint* test(){int a 10;return a;
}int main(){int* p test();*p 20;return 0;
}当在执行test()函数时开辟了一块存储空间存放a执行int* p test();这条语句p接收到了test()函数返回的地址执行完这条语句之后test()函数中存放a的存储空间被操作系统回收了此时指针p所指向的地址已经不是先前存放a的地址了p就成了一个野指针这时在对*p赋值就会出错。 2、如何规避野指针 1指针初始化 2避免指针越界 3指针指向空间释放时置为NULL 4使用指针前检查有效性