C++指针学习笔记


指针:指针变量存储的是值的地址
例:int变量 updates;指针变量 p_updates
updates表示值,&updates表示地址; p_updates表示地址,* p_updates表示指针所指向的值。
所以&updates=p_updates,updates=* p_updates
指针的初始化:
int *p_updates
表明* p_updates的类型为int,由于*运算符被用于指针。我们说p_updates指向int类型,我们还说 p_updates是指向int的指针,或int*。因此p_updates是指针地址,而* p_updates是int,而不是指针。
将指针初始化为一个地址:int updates=5;
                                        int *p_updates=&updates;
指针的危险:
在创建指针时,计算机将分配用来存储地址的内存,但不会分配用来存储指针所指向的数据内存。
如:long *fellow;
*fellow=23333;   //没有地址赋给指针fellow
使用new来分配内存:
在运行阶段分配未命名的内存以储存值,通过指针来访问内存。
int *pn=new int;//如果值没有名称则只能通过给他开辟新的内存空间直接通过指针来访问
*pt=1001;
使用delete释放内存: delete pt;//释放指针所指向的内存但不会删除指针变量本身,所以可以给他重新分配内存空间。
使用new来创建动态数组:
动态联编: 编译时 分配内存空间
静态联编: 运行时 如果需要数组则创建数组若不需要则不创建,还可以选择数组的长度(动态数组)。
int *psome=new int[10];//创建
delete []psome;//释放动态数组
new运算符返回的是第一个元素的地址,该地址被赋给指针psome。
指针算术:指针变量+1表明指向他后面的元素,增加的量等于指向的类型的字节数。
指针和字符串例题代码:
#include<iostream>
#include<cstring>
int main(){
usingnamespace std;
char animal[20]="bear"://用数组初始化字符串
const char *bird="wren";//最好新开辟地址虽然编译器在内存中会留出一些空间来储存代码中用引号引起来的字符串
char *ps;//为初始化
cout<<"enter a kind of animal:";
cin<<animal;
ps=animal;
cout<<(int*)animal<<endl;
cout<<(int*)ps<<endl;
ps=new char[(stren(annimal)+1];//获得新的存储空间,根据字符串长度来指定所需要的存储空间
strcpy(ps,animal);//将字符串复制到新的存储空间,如果依旧使用ps=animal则会改变ps的地址从而失去访问新分配的内存的唯一途径
cout<<(int*)animal<<endl;
cout<<(int*)ps<<endl;
delete [] ps;
return 0;
}
结果:在使用复制字符串之前的地址值指向同一个,但是创建新的存储空间之后animal的地址值不变,ps的改变。
strcpy()和strncpy()的比较:
strcpy(a,b)当被复制的字符串长度大于存储的长度,会出现错误,可能覆盖程序正在使用的内存。
strncpy(a,b,c)可以指定复制过去的字符数c。
使用new创建动态结构:
例题:
#include<iostream>
struct inflatable    //定义结构体
{char namw[20];
float volume;
double price;
};
int main(){
using namespace std;
inflatable *ps=new inflatable;//给结构体分配存储空间
cin.get(ps->name,20);//两种读取方法
cin>>(*ps).volume;
cin>>ps->price;
cout<<(*ps).name<<endl;
cout<<ps->volume<<endl;
cout<<ps->price<<endl;
delete ps;
return 0;
}
自动储存、静态储存和动态储存
自动储存: 自动变量(局部变量,通常存储在栈中先进先出)在函数内部定义的常规变量使用自动存储空间,在函数调用时自动产生在函数结束时消亡。
静态存储: 整个程序执行期间都存在的存储方式
定义静态变量的方式:1.函数外定义;2.使用关键字static double free=1;
动态存储:管理一个内存池被称为自由存储空间(free store)或堆(heap)。用new,delete来进行内存分配和释放,为了防止内存泄漏一定要同时使用new和delete。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值