指针
指针类型的意义:
1.指针类型决定了指针解引用的权限有多大(把0付给指针时,有多少内存空间变为0)
2.决定了指针走一步可以走多远
int arr[10]={0};
int *p=arr;
char *pc=arr;
虽然arr不是char型,但是依旧可以存在char里,不过pc+1就只能走一个字节。
野指针
指针指向的位置不可知。
成因:
- 没有初始化.(在声明指针的时候就要对其进行初始化)
int main() {
//p为野指针
int* p; //声明的时候没有初始化,系统会随机分配内存,这个内存不一定属于当前程序
*p = 20;//之后把20放在这个内存里,属于非法访问内存。
}
-
指针越界
-
指针指向的空间释放
#include "stdio.h"
int* text() {
int a = 10;
return &a;
}
int main() {
int* p=text();
*p = 20;
return 0;
}
a变量在出test时地址已经还给操作系统,此时p就算野指针。
避免野指针
- 指针初始化,声明的时候就赋值初始化
当前不知道初始化为什么东西时,就一开始初始为NULL。 - 小心指针越界。
- 指针使用前检查有效性,如果此时指针指向空,没办法赋值,要重新给指针分配地址。
指针的运算
- 指针减指针(两个指针指向同一块地址)
得到的是指针与指针之间的元素个数,不是字节数
#include "stdio.h"
int strlen_(char * str) {
char* start = str;
while (*str != '\0') //此处不是遍历地址,是解引用的值
{
str++;
}
return str-start; //直接用字符串第一个地址减去最后一个地址
}
int main() {
int len = strlen_("abcd");
printf("%d", len);
return 0;
}
C++类和对象
构造函数和析构函数
构造函数
- 调用对象时自动调用构造,只会调用一次
- 可以有参数,可以重载
析构函数
- 不可以有参数,不可以重载
- 只调用一次
构造函数可以有多个,析构函数只能有一个
调用规则