2017.8.21 动态分配和撤销内存的运算符new和delete

c++使用new和delete运算符来进行内存分配和撤销(而c语言是采用malloc和free函数)。是运算符,不是函数,因而执行效率高。

new运算符返回的是指针(地址):

例子:

new int;//开辟空间 存放整数,返回地址
new int(100);//开辟空间 存放整数,赋值为100,返回地址;
new char[10];//开辟空间 存放字符数组,包括10个,返回首元素地址;
new int[5][4];//开辟空间 存放二维数组,返回首元素地址;
float *p=new float(3.1415926)//开辟空间,存放实数3.1415926,将返回地址赋给指针变量p;

delete运算符

delete p;//释放单个变量空间
delete []pt;//释放数组变量空间

开辟空间存放结构体变量

空间大小由系统自动算出,不必指定;虽然没有定义struct变量,但可以通过指针p访问这一空间。
访问无名结构体变量,可以通过定义指针p进行访问。

#include <iostream>;
#include <string>;
using namespace std;
struct Student//起初读了个分号导致错误
{string name;
int num;
char sex;
};

int main ()
{Student *p;//定义一个指向结构体变量的指针变量
p=new Student;//用new开辟一个存放Student型数据的空间
p->name="Wang Fun";
p->num=10123;
p->sex='m';//字符串和字符是不一样的
cout<<p->name<<endl<<p->num<<endl<<p->sex<<endl;
delete p;
return 0;
}

动态链表未看呢。

共用体

几个变量共同占用同一段内存的结构。

union data
{int i;
…….
}
和struct的区别
struct变量所占用长度为各成员长度内存之和
共用体变量所占用长度为最长成员长度

成员访问方式
不可以只引用单个变量,如cout<

例题

问题1:定义结构体变量,输入年月日,计算是第几天,注意闰年问题。

近乎枚举的方法:主函数内完成计算。

#include <iostream> 
using namespace std; 
struct 
   { int year; 
     int month; 
     int day; 
   }date; 
int main() 
 {int days; 
  cout<<"input year,month,day:"; 
  cin>>date.year>>date.month>>date.day; 
  switch(date.month) 
  { case 1: days=date.day;      break; 
    case 2: days=date.day+31;   break; //二月统一按照28天算,然后根据年份的闰年情况和月份判断是否加1
    case 3: days=date.day+59;   break; 
    case 4: days=date.day+90;   break; 
    case 5: days=date.day+120;  break; 
    case 6: days=date.day+151;  break; 
    case 7: days=date.day+181;  break; 
    case 8: days=date.day+212;  break; 
    case 9: days=date.day+243;  break; 
    case 10: days=date.day+273; break; 
    case 11: days=date.day+304; break; 
    case 12: days=date.day+334; break; 
 } 
//年份能被4整除,但不能被100整除;或者能被400整除   并且月份要大于等于3
 if ((date.year %4== 0 && date.year % 100 != 0||date.year % 400 == 0) && date.month >=3)  days+=1; 
 cout<<date.month<<"/"<<date.day<<" is the "<<days<<"th day in "<<date.year<<"."<<endl; 
 return 0; 
} 

问题2:采用函数days实现计算。将主函数的年月入传递给函数days,计算后结果传回主函数输出。

#include <iostream> 
using namespace std; 
struct y_m_d 
     {int year; 
     int month; 
     int day; 
  }; 
 y_m_d date; //结构体变量的声明和定义

int main() 
 {int days(int,int,int);                     /* 对 days 函数的声明 */ 
  int day_sum; 
  cout<<"input year,month,day:"; 
  cin>>date.year>>date.month>>date.day; 
  day_sum=days(date.year,date.month,date.day); 
  cout<<date.month<<"/"<<date.day<<" is the "<<day_sum<<"th day in "<<date.year<<endl; 
  return 0; 
  }  
int days(int year,int month,int day)        /* 定义 days 函数 */ 
{int day_sum,i; 
 int day_tab[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; //采用数组变量存储各月份值
 day_sum=0; 
 for (i=1;i<month;i++) 
   day_sum+=day_tab[i]; 
 day_sum+=day; //加上本月的天数
 if ((year%4==0 && year%100!=0 || year%4==0) && month>=3) 
     day_sum+=1; 
 return(day_sum); 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值