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;
}
}
C++中char数组与指针区别

被折叠的 条评论
为什么被折叠?



