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; }}新闻热点
疑难解答
图片精选