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; }}新聞熱點
疑難解答
圖片精選