今天起重新学习下C++的基础知识,先整理关于指针的知识。
指针基础用法
int* p;//p是一个指针,类型是int*,要指向int类型
int* p;//强调p是一种int*类型指针——指向int数据类型
int *p;//强调*p是int类型的值
//这两种对于编译器没有区别,看个人习惯使用
int* p = (int *)40000;//强制类型转换
//此时p的内容就是40000,也代表着p指向了内存地址为40000的数据
*p = 5000;//将5000写入地址40000之后的4个字节
int n = *p;//n = 5000
//实际编程中很少有int* p = (int *)40000这种直接地址赋值的情况
//因为在地址40000存放着什么无人知晓,直接读写可能造成数据破坏
int num = 721;//通常用法为
int* p = #//此时p指针指向变量num的地址,*p=721
*p = 127;//此时num=127
分配内存给指针
int* p = (int*)malloc(sizeof(int));//使用malloc的分配及释放
//oprate
free(p);
p = NULL;
int* p = new int;//效果一致,但new为C++特有
//oprate
delete p;
//只能用delete释放使用new分配的内存
int num = 721;
int* p = #
delete p;//非法使用,因为内存不是由new分配的
动态数组
动态数组的内存分配与释放与指针类似;动态数组需要注意new[]使用delete[]来释放。
int* p = new int[3];
p[0] = 0;//可直接将p作为数组名使用
p[1] = 1;
p[2] = 2;
cout<<p[1];//此时输出为1
delete []p;
int* p = new int[3];
p[0] = 0;//可直接将p作为数组名使用
p[1] = 1;
p[2] = 2;
p = p+1;
cout<<p[1];//此时输出为2,p=p+1导致向后错一位
p = p-1;//此时delete能正确释放
delete []p;
指针变量加一后,增加的量等于它指向的类型的字节数。
常量指针
常量指针与普通指针的区别在于,不能通过常量指针去修改其指向的内容。
const int* p;
int n = 100;
p = & n;
*p = 200;//编译出错,不能通过常量指针去修改其指向的内容
n = 300;//没问题,n变为300
注意:const int* 和 int* 是不同的类型,int可以赋值给const int,但反过来不行,除非强制类型转换。
另一种常量指针,定义时将const放在int* 后面,这样的指针只能在初始化时让他指向某处,此后无法指向别处,但可以通过它修改它指向的内容。
int num1,num2;
int* const *p = &num1;
*p = 100;//num1=100,可以正常编译
p = &num2;//不行,无法指向别处
字符串与指针
字符串常量的类型就是char *,字符数组名的类型也是char *,因此可以用一个字符串常量或一个字符数组名,给一个char * 类型的指针赋值。
char* p1 = "abcd";//字符串赋值
char arr[10];
char* p2 = arr;//数组名赋值
可以用char *类型的指针给string对象赋值
string s;
char *p = "abcd";
s = p;//s变为"abcd"
指向指针的指针
int** pp;
int* p;
int n = 1;
p = &n;
pp = &p;
cout<<**pp;//输出为1