关于C++的小细节

C++中char数组与指针区别

C++里面,char a[100]=”hello”和char * p=”hello”的区别?

char a[100]在栈上分配了数组的空间,可读,可写
char *p = “hello”,字符串的空间在常量区分配,只读
严谨的写法应该是 const char *p = “hello”;
c/c++为了兼容历史代码,才允许写成char *p=“hello”,但一旦试图写入这个空间,操作系统(DOS不算啊)会捕捉到这个错误的

二者在内存中的位置肯定是不同的,前者是字符型数组,是将字符串放到了这个数组中,分配在内存的栈区域,而后者则是将字符型指针指向此字符串,是将字符串的首地址赋给了指针p,但是字符串是在内存的程序区,这是二者的区别,从访问机制上来说,数组用下标运算符“[ ]”进行值访问,例如a[0]值为h,a[1]值为e;指针则是需要用反向引用运算符进行值访问“”例如:*p值为h (p+1)值为e。

区别之一:
a[100] =”hello”; 分配100个字节内存,而char *p = ”hello” 只分配6个字节内存
区别之二:
前者所存的内容可以改变(例如a[3]=’A’; OK),而后者则不可以(例如p[3]=’A’; Error)。

面试编程题
1、计算两个日期之间相隔的天数
闰年:公元年数可被4整除(但不可被100整除)为闰年,但是正百的年数必须是可以被400整除的才是闰年,其他都是平年

void IsLeap(int year)
{
  return( year % 4 == 0 || year % 400 == 0) && (year % 100 !=0);
}

计算两个年月日之间的总天数,思路是分别算出日期的总天数,然后相减。

typedef struct  
{
    int iYear;
    int iMonth;
    int iDay;
}Date;

//IsLeap函数判断一个年份是否为闰年,方法如下:
bool IsLeap(int year)
{
    return (year % 4 ==0 || year % 400 ==0) && (year % 100 !=0);
}

//DayInYear能根据给定的日期,求出它在该年的第几天,代码如下
int DayInYear(Date* pDate)
{
    int iRet = 0;
    int DAY[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    if(IsLeap(pDate->iYear))
        DAY[1] = 29;
    for(int i=0; i < pDate->iMonth - 1; ++i)
    {
        iRet += DAY[i];
    }
    return iRet;
}

int DaysBetween2Date(Date* pDate1, Date* pDate2)
{
    //取出日期中的年月日
    Date *pTmp;

    if(pDate1->iYear == pDate2->iYear && pDate1->iMonth == pDate2->iMonth)
    {
        return abs(pDate1->iDay - pDate2->iDay);
    }
    else if(pDate1->iYear == pDate2->iYear) //如果年相同
    {
        return abs(DayInYear(pDate1) - DayInYear(pDate2));
    }
    else    //年月都不相同
    {
        int d1,d2,d3;

        //确保pDate1->year1年份比pDate2->year2早
        if(pDate1->iYear > pDate2->iYear)
        {
            pTmp = pDate1;
            pDate1 = pDate2;
            pDate1 = pTmp;
        }

        if(IsLeap(pDate1->iYear))
            d1 = 366 - DayInYear(pDate1); //取得这个日期在该年还于下多少天
        else
            d1 = 365 - DayInYear(pDate1);
        d2 = DayInYear(pDate2); //取得在当年中的第几天

        d3 = 0;
        for(int year = pDate1->iYear + 1; year < pDate2->iYear; year++)
        {
            if(IsLeap(year))
                d3 += 366;
            else
                d3 += 365;
        }
        return d1 + d2 + d3;
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值