C++指针

声明和初始化指针

声明指针:
方式一:

typeName * pName;
int* ptr;

用这种方式声明指针后必须要对指针进行初始化后才能使用。

方式二:

int higgens = 5;
int* pt = &higgens;

这种情况初始化的是指针,pt和higgens指的同一个地址。

使用new分配内存

通用格式:

typeName* pointer_name = new typeName;

使用new分配内存,返回的是内存块的地址。

int nights = 1001;
int* pt = new int;//分配一个int类型的内存
*pt = 1001;//pt所指的内存存储的值和nights的值一样,但是pt的地址和nights的地址不同,它们处于不同的内存
double* pd = new double;//分配一个double类型的内存
*pd = 1001.0;

这里sizeof(pt)和sizeof(pd)的值一样,都为4,因为pt和pd都是指针,长度一样;sizeof(*pt)的值是4,sizeof(pd)的值是8,因为pt是int类型,*pd是double类型。

使用delete释放内存

delete pt;
pt = NULL;
delete pd;
pt = NULL;

已经释放过的内存不能再释放.
这里只是释放指针所指向的内存,并没有删除指针,内存释放之后可以让pt或pd再指向其他地址,如果不再指向其他地址,就设置为NULL,避免成为野指针。并且delete要和new配对使用,否则会发生内存泄漏。

使用new创建动态数组

通用格式:

typeName* pointer_name = new typeName[N];//N表示要包含多少个元素

例如:

int* psome = new int[10];//创建一个包含10个int元素的数组

这里new运算符返回的是第一个元素的地址。
释放内存:

delete [] psome;

动态数组的使用:

double* pa = new double[3];
pa[0] = 0.2;
pa[1] = 0.5;
pa[2] = 0.8;
cout << pa[1] << endl;
pa = pa + 1;//指针向后移一个单位,指向下一个元素
cout << pa[0] << endl;
cout << pa[1] << endl;
pa = pa - 1;//指针指向开始地址
delete[] pa;
pa = NULL;

输出结果:
0.5
0.5
0.8

数组和指针

double wages[3] = {10000.0, 20000.0, 30000.0};
short stacks[3] = {3, 2, 1};
//两个方式得到数组地址
double* pw = wages;
short* ps = &stacks[0];
cout << *pw << endl;//输出wages数组的第一个元素
pw = pw + 1;//指向下一个元素
cout << *pw << endl;
cout << *ps << endl;//输出stacks数组的第一个元素
ps = ps + 1;//指向下一个元素
cout << *ps << endl;
cout << stacks[0] << "," << stacks[1] << endl;
cout << *stacks << "," << *(stacks + 1) << endl;
cout << sizeof(wages) << endl;//得到数组的长度
cout << sizeof(pw) << endl;//得到指针的长度

输出结果:
10000.0
20000.0
3
2
3,2
3,2
24
4
注意:
1、将指针变量加1,增加的量等于指针指向的类型占用的字节数
2、对数组应用sizeof运算符得到的是数组的长度,对指针运用sizeof得到的是指针的长度。
3、程序运行时,C++将数组名解释为地址。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值