目录
前言:
指针:
什么是指针:
指针的大小:
指针类型的意义:
野指针:
野指针的成因:
1.指针未初始化
2.指针越界
3.指针指向的空间释放了
如何避免野指针:
1.指针初始化
2.小心指针越界
3.指针指向空间释放即时置NULL
4.指针使用前检查它的有效性
指针运算:
1.指针+-整数
2.指针-指针
指针和数组:
二级指针:
指针数组:
结束语:
前言:
这次小编将会和大家分享一下指针方面的一些知识,虽然指针相对于前面的知识来说学一起来可能会有些困难,但是不要害怕跟着小编一起来走进指针的世界吧!
指针:
什么是指针:
在内存中每一块空间都会有一个编号,其中编号就是地址,地址也就是指针。(编号----地址----指针)
指针的大小:
指针在32位平台上是4个字节,在64位平台上是8个字节。
指针类型的意义:
指针也是有类型的,那么这些类型又都又什么意义呢?
1.指针类型决定了指针解引用的权限有多大。
代码如下:
#define _CRT_SECURE_NO_WARNINGS 1 #includeint main() { int* pa; char* pc; float* pf; printf("%dn", sizeof(pa)); printf("%dn", sizeof(pc)); printf("%dn", sizeof(pf)); return 0; }
代码运行截图如下所示:
2.指针类型决定了指针走一步能走多远(步长)。
代码如下所示:
#define _CRT_SECURE_NO_WARNINGS 1 #includeint main() { int arr[10] = { 0 }; int* p = arr; char* pc = arr; printf("%pn", p); printf("%pn", p + 1); printf("n"); printf("%pn", pc); printf("%pn", pc + 1); return 0; }
代码截图如下所示:
野指针:
野指针就是指指针指向的位置是不可知的。
野指针的成因:
1.指针未初始化
代码如下所示:
#define _CRT_SECURE_NO_WARNINGS 1 #include//代码不可运行 int main() { int* p; *p = 20;//未初始化 return 0; }
2.指针越界
代码如下所示:
#define _CRT_SECURE_NO_WARNINGS 1 #includeint main() { int arr[10] = { 0 }; int* p = arr; int i = 0; for (i = 0; i <= 10; i++) { *p = i; p++; } return 0; }
代码运行截图如下所示:
发生越界显示如下:
3.指针指向的空间释放了
代码如下所示:
#define _CRT_SECURE_NO_WARNINGS 1 #includeint* test() { int a = 10; return &a; } int main() { int* p = test(); *p = 20;//修改值的时候a的空间已经释放了 return 0; }
如何避免野指针:
1.指针初始化
当不知道初始化为什么时初始化为NULL。
#define _CRT_SECURE_NO_WARNINGS 1 #includeint main() { int* p = NULL; return 0; }
明确知道初始化的值。
代码如下所示:
#define _CRT_SECURE_NO_WARNINGS 1 #includeint main() { int a = 20; int* p = &a; *p = 10; printf("%dn", *p); return 0; }
代码截图如下所示:
2.小心指针越界
在C语言中是不会检查数组越界行为的。
3.指针指向空间释放即时置NULL
4.指针使用前检查它的有效性
指针运算:
1.指针+-整数
指针运算:
1.指针+-整数
代码如下所示:
#define _CRT_SECURE_NO_WARNINGS 1 #includeint main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int* p = arr; int* pend = arr + 9; while (p <= pend) { printf("%dn", *p); p++; } return 0; }
代码截图如下所示:
2.指针-指针
指针-指针得到的是两个元素之间的个数。
代码如下所示:
#define _CRT_SECURE_NO_WARNINGS 1 #includeint main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; printf("%dn", &arr[9] - &arr[0]); return 0; }
代码截图如下所示:
指针和指针相减的前提是两个指针指向同一块空间。
代码如下所示:
#define _CRT_SECURE_NO_WARNINGS 1 #include//实现一个计算字符长度的函数 int my_strlen(char* str) { char* start = str; while (*str != ' ') { str++; } return str - start; } int main() { int len = my_strlen("abc"); printf("%dn", len); return 0; }
代码运行截图如下所示:
3.指针的关系运算
标准规定:允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。
指针和数组:
数组名是数组首元素的地址。
代码如下所示:
#define _CRT_SECURE_NO_WARNINGS 1 #includeint main() { int arr[10] = { 0 }; printf("%pn", arr);//数组名 printf("%pn", &arr[0]);//数组的首地址 return 0; }
代码如下截图所示:
二级指针:
解释见代码,代码如下所示:
#define _CRT_SECURE_NO_WARNINGS 1 #includeint main() { int a = 10; int* pa = &a;//此处的pa就是一级指针 int** ppa = &pa;//此处的ppa就是二级指针 int*** pppa = &ppa;//此处的pppa就是三级指针 return 0; }
指针数组:
数组也是有指针的,下面小编给大家浅浅的介绍一下指针数组的格式吧。
代码如下所示:
#define _CRT_SECURE_NO_WARNINGS 1 #includeint main() { int arr[10]; char ch[5]; int* paar[5];//整形数组指针 char* pch[5];//字符型数组指针 return 0; }
结束语:
这次小编就分享到这里啦!如果想要看C语言其他系列的,点击下面的链接哦!希望对大家有所帮助,想要学习的同学记得关注小编和小编一起学习吧!如果文章中有任何错误也欢迎各位大佬及时为小编指点迷津(在此小编先谢过各位大佬啦!)



