指针详细基础知识(包括内存分配,动态数组,常量指针,字符串与指针,指针的指针)

今天起重新学习下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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值