30分钟学会C/C++指针 (二)
程序员文章站
2023-12-21 13:19:28
...
野指针
- 指向已经被销毁的内存
- 指向无权访问的内存
int *p=(int *)malloc(4);
free(p); //此时沦为野指针,内存已经被销毁
int *p=(int *)0X12312345;
*p=100; //修改了操作系统的数据
cout<<*P<<endl: //指向未知
-
危害
- 野指针的内存不确定,对其他操作会导致内存的修改,导致不易察觉的BUG或者系统崩溃
避免野指针
- 养成指针初始化的好习惯
int *p=NULL;
- 释放内存后将指针置为NULL
free(p);
P=NULL;
if(p!=NULL)
{
//才使用p
}
指针的加减法
指针 + 整数 N,表示偏移的N*sizeof(类型)
int a=100;
int *p=&a;
cout << p << , << p+2 <<endl;
//p和p+2相差 2*sizeof(int)=8个
char a='1';
int *p=&a;
cout << p << , << p+2 <<endl;
//p和p+2相差 2*sizeof(char)=2个 ,一个char占一个字节
++p,–p,指针本身的值会改变
int *p=&a;
cout << p << endl;
cout << --p << endl;
cout << p << endl; //--后指针自身的值改变
指针 - 指针
int *p1=&a;
int *p2=&a+3;
cout << &(p2-p1)<<endl; //结果为三
cout <<(unsigned)p2-(unsigned)p1<<endl; //结果为12,3*sizeof(int)
一维数组
char a[] = "1234";
string b = "12345689";
cout << sizeof(a) << endl;//5
cout << sizeof(b) << endl;//32
cout<<sizeof(1==2)<<endl;//1
return 0;
利用指针访问数组元素
for (int i=0;i<5;I++)
{
//cout << *(p+i)<<endl;
cout << *(++p)<<endl;//p值已经改变
cout << *(a+i)<<endl;//a为一个数组
}
类型 | 是否可变 | 可运算 |
---|---|---|
数组名 | 不可变,它是常量 | 可++,- - |
指针 | 可以变,它是变量 | 可++,- - |