1. 指针声明和初始化
第一种:
int a = 5;
int *pt = &a;
在第一种中,不能用int*pt=a;因为a是一个常量值,此时没有给pt所指向的内存赋值
第二种:
int *pt = new int;
delete pt;
//给pt赋值
int *pt = new int;
*pt = 7;
delete pt;
在第二种中,new了之后必须用delete进行内存释放,但是只是释放pt所指向的内存,pt本身还存在
第三种:
//采用malloc的方式,需要用free释放
int * pt = (typename * )malloc(size);
free(pt);
2.指针的危险
2.1野指针
产生野指针的原因主要有以下三个:
1.指针变量没有被初始化
char* p;//这时候p为野指针
2.在指针被free或delete之后,没有置为NULL。
在指针被free和delete之后需要将其置为NULL,因为delete只是删除了指针指向内存中的内容,而指针还是存在的。
3.对于指针的操作超出了范围
char * a = new char[10];
int x = 5;
cout << *(a+x);
4.函数返回的是指针
char * a(){
char p[] = "abc";
return p;
}
int main(){
a();
return 0;
}
此时p的内容为"abc",存储在栈区域,生命周期为该函数调用时间,当函数结束时,内容被清除,p就变为了野指针
改写:
//方法一
char * p = "abc";
//方法二
char *p = new char[];
strcpy(p,"abc");
2.2资源泄露
char * a = new char[10];//分配了10个内存空间,并且指针指向该内存
a = "abcd";//此时p的指向由原来的内存空间变为了指向常量“abcd”,从而造成资源泄露
delete [] a;//报错
第二步可以采用strcpy替换,strcpy(a,“abcd”),将abcd存入内存空间
char * a = new char[10];
strcpy(a,"abcd");
delete [] a;