前言
这一章主要讲了const修饰指针和assert断言
制作不易,求个关注
一、const修饰指针
const是常属性的意思
const修饰指针时可以在*的左边和右边,意义不一样。
const int * pa ;修饰的是指针指向的内容,*pa不可以被修改,但是pa可以改,可以让pa指向其他变量的地址。
int * const pa;修饰的是指针变量本身pa,pa不可以改,*pa可以改
二、野指针
野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
1.原因
1.指针没有初始化
#include <stdio.h>
int main()
{
int* p;//局部变量指针未初始化,默认为随机值
*p = 20;
return 0;
}
2.指针越界访问
#include <stdio.h>
int main()
{
int arr[10] = { 0 };
int* p = &arr[0];
int i = 0;
for (i = 0; i <= 11; i++)
{
//当指针指向的范围超出数组arr的范围时,p就是野指针
*(p++) = i;
}
return 0;
3.指针指向的空间被收回
#include <stdio.h>
int* test()
{
int n = 100;
return &n;
}
int main()
{
int* p = test();//把n的地址传过来时,n的内存已经被收回了
printf("%d\n", *p);
return 0;
}
办法
指针要初始化
不用时要及时置空;例:int * pa=NULL;
下次使用时要检查指针是不是有效。
避免返回局部变量的地址。
assert断言
assert.h这个头文件定义了assert()宏
assert(pa != NULL)
上面这个代码会验证pa是否等于NULL,不等于就继续运行,等于就会终止,并打印报错信息。
传址调用和传值调用
传值调用就是实参传给形参时,把数值传递过去,改变形参不影响实参
传址调用就是把实参的地址传过去的,改变形参就是改变实参
1万+

被折叠的 条评论
为什么被折叠?



