//use pointer to change value
*p_updates=*p_updates+1;
cout<<"now updates="<<*p_updates<<endl;
long *fellow//create a pointer-to-long
*fellow=2333//place a value in never-never land
//use_new.cpp
#include <iostrteam>
int main()
{
using namespace std;
int nights=10001;
int *pt=new int;
*pt=1001;
cout<<"nights value ="<<nights<<" : location "<<&nights<<endl;
cout<<"int value ="<<*pt<<": location ="<<pt<<endl;
cout<<"size of pt="<<sizeof(pt)<<endl;
cout<<"size of *pt="<<sizeof(*pt)<<endl;
double *pd=new double;
*pd=100.0;
cout<<"double value ="<<*pd<<": location="<<pd<<endl;//100的地址
cout<<"location of pointer pd:"<<&pd<<endl;//指针本身是一个变量,有地址
cout<<"size of pd="<<sizeof(pd)<<endl;//结果为4?????
cout<<"size of *pd="<<sizeof(*pd)<<endl;//结果为8?????
return 0;
}
//使用delete
int *ps=new int;//allocate memory with new
...//use the memory
delete ps;//free memory with delete when done
//这将释放ps指向的内存,但不会删除ps指针本身。例如可以将ps重新指向另一个新分配的内存块。
//一定要成对的使用new和delete,否则会发生内存泄漏,也就是说被分配的内存再也无法使用了,如果内存泄漏严重,则程序将由于不断寻找新的内存而停止
int *ps=new int;//ok
delete ps;//ok
delete ps//not ok now
int jugs=5;//ok
int *pi=&jugs;//ok
delete pi;//not allowed,momory not allocated by new
//不要尝试释放已径释放的内存块(会发生未知的错误)。更不能使用delete来释放通过声明变量所获得的内存(而对空指针使用delete是安全的)
int*ps=new int;//allocate memory
int *pq=ps;//set second pointer to same block
delete pq;//delete with second poniter
//注意,使用delete的关键在于,将他使用于new分配的内存。这并不意味着要使用于new的指针,而是使用于new的地址
//一般来说,不要创建两个指向同一个内存块的指针,因为这将增加错误地删除同一个内存块两次的可能性。但是在返回指针函数的时侯,使用另一个指针确实很有道理
//使用new创建动态数组
int *psome=new int [10];//必须指定值
delete [] psome;//删除,而且是从psome的第一个元素删除,如果改变psome的位置删除工作也会发生变化
//谨记:
//不要使用delete来删除不是new分配的内存
//不要使用delete释放同一个内存两次
//如果使用new[]为数组分配内存,应是用delete []来释放
//使用new为一个实体分配内存,应是用delete(没有[])来释放
//对空指针使用delete是安全的
//使用动态数组
#include <iostream>
int main()
{
using namespace std;
double *p3=new double[3];
p3[0]=0.2;
p3[1]=0.5;
p3[2]=0.8;
cout<<"p3[1] is "<<p3[1]<<".\n";
p3=p3+1;
cout<<"NOW p3[0] is "<<p3[0]<<" and ";
cout<<"p3[1] is "<<p3[1]<<".\n";
p3=p3-1;
delete []p3;
return 0;
}
//下面的代码行指出了数组名与指针明的本质区别
p3=p3+1;//okay for pointers,wrong for array names;
//不能改变数组名,但指针是变量,因此可以修改他的值,多注意一下p3+1的效果。表达式p3[0]现在指的是数组的第二个值。因此将p3+1导致他指向第二个元素而不是第一个
//将他减一后指针将指向原来的地址,这样为delete[]提供了准确的地址(疑问:不进行-1操作会不会再删除的时候把p3之前的地址内存都保留下来?)
#include <iostream>
int main()
{
using namespace std;
double wages[3]={1000.0,2000.0,3000.0};
double *pw=wages;
cout<<sizeof(wages)<<" = sizeof wages array"<<endl;
cout<<sizeof(pw)<<" = sizeof pw pointer"<<endl;
return 0;
}
//指针和字符串
//一般来说给cout提供一个指针,它必然将打印一个地址,但对于char类型的指针,cout将显示的是一个字符揣,如果要显示字符踹的地址,就必须加上强制转化类型(int*),且*不能在()外面
//要想获得字符踹的一个副本,首先分配内存来存储该字符踹,可以用数组或new来完成,但用new能根据字符踹的长度来分配内存空间,列:
ps=new char [strlen(...)=1];
strcpy(ps,...);//在这儿复制得到的(int*)ps和...的地址也是不相同的
//使用new来创建动态结构
#include <iostream>
struct inflatable
{
char name[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<<' '<<ps->price<<' '<<ps->volume<<endl;
return 0;
}
//看下面一个程序体会并学会应用(相比数组对内存的优势)
#include <iostream>
#include <cstring>
using namespace std;
char *getname(void);
int main()
{
char *name;
name = getname();
cout<<name<<" at "<<(int *)name<<"\n";
delete []name;
name=getname();
cout<<name<<" at "<<(int *)name<<endl;
delete []name;
return 0;
}
char *getname()
{
char temp[80];
cin>>temp;
char *pn=new char[strlen(temp)+1];
strcpy(pn,temp);
return pn;
}
//静态存储方式一种是在函数外面定义它,一种是在函数内用static动态存储则是new(必须和delete配对使用,否则会引起严重的内存泄漏,导致本程序或和该内存附近的存储空间程序崩溃)