小团队兼职做网站,手机网站建设软件有哪些内容,卖设计图的网站,有趣的网站名称文章目录一、指针是什么❔二、指针和指针类型1.指针-整数2.指针解引用三.野指针1.引起野指针的原因2.如果避免野指针完结一、指针是什么❔ 指针也就是 内存地址 #xff0c;在计算机上我们访问数据需要通过内存地址来访问#xff0c;在C语言中#xff0c;指针变量是用来存放…
文章目录一、指针是什么❔二、指针和指针类型1.指针-整数2.指针解引用三.野指针1.引起野指针的原因2.如果避免野指针完结一、指针是什么❔ 指针也就是 内存地址 在计算机上我们访问数据需要通过内存地址来访问在C语言中指针变量是用来存放内存地址的变量在不同系统下指针内存地址的长度不同32位CPU下由于有32根地址线所以指针内存地址是由32个bit位组成的也就是4Byte在64位CPU下有64根地址线所以地址由64个bit位组成也就是8Byte指针指向的地址都是一个内存单元一个内存单元里面有1byte的数据。 创建第一个指针变量
#include stdio.hint a 8; //先创建一个变量此变量在内存中有自己的地址。
int *pa a; //符号取出a的地址交给pa指针*符号表示pa是指针类型
*pa 10; //我们可以通过*pa修改a的值没有*的话pa是a的地址*是解引用的意思加上之后pa代表的就不是a的地址而是a
printf(%d,*pa); //10二、指针和指针类型
指针是用来存放地址的那么为什么还分为char* int* short* long*…….? 一般情况下char**类型的指针是为了存放char类型变量的地址int类型的指针是为了存放int类型的地址short类型的指针是为了存放short类型的地址…….但实际上指针的类型有一下两大作用 指针类型决定了指针进行±整数的时候±的步长字节指针类型决定了对指针进行解引用的时候能访问几个字节 1.指针±整数 代码示例:
#include stdio.hint main()
{int a 10;char* char_pa (char*)a;short* short_pa (short*)a;int* int_pa (int*)a;printf(%p\n,a); //00000071DCEFFC24 %p输出a的的地址printf(%p\n,char_pa); //00000071DCEFFC24 printf(%p\n,char_pa1); //00000071DCEFFC25 加了一个字节printf(%p\n,short_pa); //00000071DCEFFC24printf(%p\n,short_pa1); //00000071DCEFFC26 加了两个字节printf(%p\n,int_pa); //00000071DCEFFC24printf(%p\n,int_pa1); //00000071DCEFFC28 加了四个字节} 可以看到在地址1之前他们的地址都是与*a一样进行1之后char加了一个字节short加了两个字节int加了三个字节也就是说指针类型能决定指针±的时候可以±多少个字节±的字节由类型的长度决定。 2.指针解引用
代码示例
#include stdio.hint main()
{int a 0x11223344;char *char_pa (char*)a;short *short_pa (short*)a;int *int_pa a;printf(%d\n,*char_pa);printf(%d\n,*short_pa);printf(%d\n,*int_pa);}输出结果
明明我们赋值的都是a那为什么会造成三个类型解引用都不一样呢,我们可以用下面代码测试一下看看内存发生了什么。
int main()
{int a 0x11223344;char *char_pa (char*)a;*char_pa 0;
}这是在a没有改动之前 执行*char_pa 0;
a的一个字节被置为了0
int main()
{int a 0x11223344;short *short_pa (short*)a;*short_pa 0;
}执行*short_pa 0;
a的两个字节被置为了0 int main()
{int *int_pa a;*int_pa 0;return 0;
}执行*int_pa 0;
a的四个字节被置为了0
由此我们可以得出结论指针类型的第二大作用就是指针类型决定了对指针解引用时能访问或修改几个字节这由数据类型的大小决定
三.野指针 野指针会指向一段实际的内存但是野指针是指指针指向的位置是不可知的随机的不正确的没有初始化的没有明确限制的它指向哪里我们不知道或者说它指向的空间已经被我们释放那么他就是一个野指针在程序中我们必须要避免野指针的出现。 下面是容易出现野指针的场景
1.引起野指针的原因
1指针未初始化。
#include stdio.h
int main()
{int *p; //指针没有指向明确的地址那么将是随即地址也就是野指针*p 1;
}2指针越界访问
#inlcude stdio.h
int main()
{int arr[10] {0}int *p arr;for(int i0;i13;i){*(p) 8; //当指针超出arr数组的范围时p就是野指针}
}3指针指向的空间被释放
int main()
{int *p malloc(10 * sizeof(int));free(p);*p 10; //指针p指向的内存空间已经被释放此时的p就是野指针return 0;
}2.如果避免野指针
1指针初始化
2小心指针越界
3指针指向空间释放即使置NULL
4避免返回局部变量的地址
5指针使用之前检查有效性
int main()
{int *p NULL; //使用之前初始化为NULLif(p!NULL){*p 10; //使用之前检查有效性 }int *pa malloc(10 * sizeof(int));//此处省略n行代码free(p);pa NULL; //指针用完之后及时置空。
}完结
创作不易还请各位小伙伴多多点赞关注✨收藏⭐