ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

c语言--指针常量,常量指针,多级指针,空指针,野指针

c语言--指针常量,常量指针,多级指针,空指针,野指针 指针常量是个常量值是个地址。语法类型关键字 *const 指针常量名 地址;特点1. 可以修改指向的数据2. 不可以修改指向3. 数组名可以认为是指针常量arr不能被赋值、不能改变指向但是可以解引用修改数组里面的元素。行为和int * const高度相似所以比喻它是指针常量。#include stdio.h int main() { // 指针常量------------------------------ // 定义变量 int num 100; // 定义指针常量指向num int *const p1 num; // 通过指针常量修改指向的数据 *p1 500; printf(num %d \n, num); // 不能修改 p1 的指向 // int num2 250; // p1 num2 return 0; }可以发现指针常量可以修改指向的数据但是不能修改指针的指向② 常量指针a pointer to constant常量指针是个指针指向一个常量。语法const 数据类型关键字 *常量指针名 地址;// 或者数据类型关键字 const *常量指针名 地址;特点1. 不可以修改指向的数据只可以读取指向的数据2. 可以修改指向3. 函数名、指向字符串字面量常量的字符指针 都可以认为是常量指针✅指针本身可以改变指向❌不允许通过这个指针修改它指向的那块内存内容注意常量指针指向的不一定是真的常量但是常量指针会把指向的数据当做是常量。#include stdio.h int main() { int num 100; // 常量指针---------------------------- const int *p2 num; // int const *p2 num; // 与上面等价 // 通过常量指针可以读取指向的数据 printf(*p2%d \n, *p2); // 通过常量指针不能修改指向的数据 // *p2 100; // 常量指针可以更改指向 int num2 250; p2 num2; printf(*p2%d \n, *p2); return 0; }虽然p2指向的是num这个变量但是常量指针会把他当成一个常量所以不能修改指针指向的值但是能修改指针的指向多级指针指向指针的指针是一种多级间接寻址的形式或者说是一个指针链。通常一个指针包含一个变量的地址。当我们定义一个指向指针的指针时第一个指针包含了第二个指针的地址第二个指针指向包含实际值的位置。#include stdio.h int main() { // 定义整数变量 int num 100; // 定义指针指向num一级指针 int *ptr1 num; // 定义指针指向ptr1二级指针 int **ptr2 ptr1; // 定义指针指向ptr2三级指针 int ***ptr3 ptr2; printf(ptr1%p, ptr1%p, *ptr1%d \n, ptr1, ptr1, *ptr1); printf(ptr2%p, ptr2%p, *ptr2%p, **ptr2%d \n, ptr2, ptr2, *ptr2, **ptr2); printf(ptr3%p, ptr3%p, *ptr3%p, **ptr3%p, ***ptr3%d \n, ptr3, ptr3, *ptr3, **ptr3, ***ptr3); printf(\n); return 0; }空指针赋为NULL 值的指针被称为空指针NULL 是一个定义在标准库 stdio.h中的值为零的宏常量。声明指针变量的时候如果没有确切的地址赋值为指针变量赋一个NULL 值是好的编程习惯。空指针危害:未初始化的指针称为悬空指针可能指向内存中的随机地址某些平台会将指针变量内存中的垃圾数据误认为有效地址导致危险操作#include stdio.h int main() { // 没有对p1初始化p1是悬空指针不推荐的 int *p1; // 将 NULL 赋值给指针避免出现悬空指针 int *p2 NULL; double *p3 NULL; int(*p4)[10] NULL; printf(p2: %p \n, p2); //printf(*p2: %d \n, *p2); int num 100; p2 num; return 0; }内存访问:NULL指向地址0处是系统不可访问空间打印空指针值会显示0000000000000000(16进制0)运行时错误:解引用空指针会导致段错误(Segmentation fault)编译时无法检测运行时才会报错野指针野指针就是指针指向的位置是不可知随机性不正确没有明确限制的。成因1.指针使用前未初始化指针变量在定义时如果未初始化其值是随机的此时操作指针就是去访问一个不确定的地址所以结果是不可知的。此时p就为野指针。int*p;printf(%d\n,*p);在没有给指针变量显式初始化的情况下一系列的操作(包括修改指向内存的数据的值)也是错误的。int*p;*p10;2.指针越界访问intarr[4]{10,20,30,40};int*parr;p4;printf(%d,*p);//此时*p即为越界访问当 p 4之后此时*p访问的内存空间不在数组有效范围内此时*p就属于非法访问内存空间p为野指针。3.指针指向已释放的空间#includestdio.hint*test(){inta10;returna;//a0x0012ff40}intmain(){int*ptest();printf(%d,*p);return0;}调用test()函数将返回值赋给ptest函数的返回值是局部变量a的地址函数调用结束局部变量会被销毁其所占用的内存空间会被释放p 指向的是已经释放的内存空间所以 p 是野指针。避免野指针​​​​​​​指针初始化如果没有确切的地址赋值为指针变量赋一个 NULL 值是好的编程习惯。小心指针越界。避免返回指向局部变量的指针。指针使用之前检查指针是否为 NULL。​​​​​​​指针使用一览变量定义类型表示含义int iinti是一个整型变量。int *pint *p 是一个指向整型数据的指针int a[5]int[5]a是一个5个元素的整型数组。int *p[4]int *[4]p 是一个指针数组每个元素都是指向整型数据的指针。int (*p)[4]int (*)[4]p是一个数组指针指向一个4个元素的整型数组。int f()int ()f是一个返回整型数据的函数int *f()int *()f是一个指针函数返回指向整数数据的指针。int (*p)()int (*)()p 是一个函数指针指向一个返回整型数据的函数。int **pint **p是一个指向指针的指针。指针这块知识点总算学完了
返回列表