欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
C語(yǔ)言測試題的講解分析
int x=35;
char str[10];

//問(wèn):strlen(str)和sizeof(str)的值分別是多少?
// strlen(str) 值不確定,strlen根據‘\0‘確定字符串是否結束。
// sizeof(str)=10 sizeof一個(gè)數組為數組長(cháng)度

strcpy(str,"www.it315.org"/*共13個(gè)字母*/);
//問(wèn):此時(shí)x和strlen(str)的值分別是多少?
// x 為35
// strcpy(char* dest, const char* src)
// 根據src來(lái)復制dest,依照src的‘\0‘決定復制的長(cháng)度,而dest必須要提供足夠的長(cháng)度,這里會(huì )引起溢出,strlen返回13,但是數組外部的數據已經(jīng)被破壞
//(作者注:我下面給出了更確切的答案 )

str="it315.org";//編譯能通過(guò)嗎?
// 數組不能賦值,只能初始化。char str[10] = "it315.org";
// 而且初始化時(shí)編譯器會(huì )檢查數組的長(cháng)度與初始化串的長(cháng)度是否匹配

char *pstr;
strcpy(pstr,"http://www.it315.org");
//上句編譯能通過(guò)嗎?運行時(shí)有問(wèn)題嗎?
// 可以通過(guò)編譯,但是pstr指向了常量區,運行時(shí)最好只做讀操作,寫(xiě)操作不保險
//(作者注:我下面給出了更確切的答案 )

const char *p1;
char * const p2;
//上面兩句有什么區別嗎?
// const char* 和 char const* 一樣,都是表示指向常量的字符指針。
// char * const 表示指向字符的常量指針

p1=(const char *)str;
//如果是p1=str;編譯能夠通過(guò)嗎?明白為什么要類(lèi)型轉換?類(lèi)型轉換的本質(zhì)是什么?
// 可以通過(guò)編譯。關(guān)于常量與非常量指針的關(guān)系是這樣的:
// const指針可以指向const或者非const區域,不會(huì )造成什么問(wèn)題。
// 非const指針不能指向const區域,會(huì )引起錯誤。

strcpy(p1,"abc");//編譯能夠通過(guò)嗎?
// 不能通過(guò),strcpy( char*, const char*); char* 不能指向const char*

printf("%d",str);//有問(wèn)題嗎?
// 沒(méi)有問(wèn)題,輸出的是str的地址信息。

pstr=3000;//編譯能過(guò)嗎?如果不行,該如何修改以保證編譯通過(guò)呢?
// 不能通過(guò),char* pstr表示pstr是個(gè)字符指針,不能指向3000的整形變量。
// 修改的話(huà),可以這樣:pstr = (char*)3000,把pstr指向3000這個(gè)地址;

long y=(long)pstr;//可以這樣做嗎?
// 可以,y的值為pstr所指的地址。不過(guò)如果是純粹要地址的話(huà),最好是用unsigned long。

int *p=str;
*p=0x00313200;
printf("%s",str);//會(huì )是什么效果?提示0x31對應字符‘1‘,0x32對應字符‘2‘。
// 首先編譯未必會(huì )過(guò)關(guān),有些編譯器可能不允許int * 直接指向char*。最好是改為int *p = (int*)str;
// 過(guò)關(guān)了效果就是什么東西都沒(méi)有。int *p=str; p為str所指的地址,*p表示修改了str所指向的內存。
// 由于sizeof(int)在32位機上,int有4個(gè)字節(其實(shí)具體要看編譯器的配置文件,好像是limit.h,一般是4個(gè)字節)所以修改了str[0]-str[3]
// 由于0x00313200頭尾都是0,所以字符串為‘\0‘開(kāi)頭,什么都打印不出來(lái)。這里有個(gè)Big-endin和little-endin的問(wèn)題。以0x31323334為例
// little-endin的機器上面,0x31323334在內存中排列順序為34 33 32 31,輸出為4321,如INTEL芯片的pc
// big-endin機器上面為31 32 33 34 ,輸出為1234,如IBM POWERPC

p=3000;//p+1的結果會(huì )是多少?
// 3000+sizeof(int); 指針+1均為原來(lái)地址加上sizeof(指針所指的數據類(lèi)型)

char *pc=new char[100];//上述語(yǔ)句在內存中占據幾個(gè)內存塊,怎樣的布局情況?
// 本身pc會(huì )占用函數棧一個(gè)4字節的指針長(cháng)度(具體是否為4個(gè)字節要看機器和編譯器)。
// new會(huì )在堆上申請100個(gè)字節sizeof(char)的連續空間。

void test(char **p)
{
*p=new char[100];
}//這個(gè)編譯函數有問(wèn)題嗎?外面要調用這個(gè)函數,該怎樣傳遞參數?
// 該程序沒(méi)有問(wèn)題。需要在函數中對指針所指的地址進(jìn)行變化是必須傳人指針的地址。
// 原因是這樣的:如果傳入的為指針本身,在函數調用的時(shí)候,實(shí)參會(huì )被復制一個(gè)實(shí)例,這樣就不是原來(lái)的指針了,對該指針本身進(jìn)行的任何改變都不能傳遞回去了。
// 可以這樣理解,如果傳入的參數為int,那么對int本身的值的改變就傳不回去啦,加個(gè)*也是一樣的。


//能明白typedef int (*PFUN)(int x,int y)及其作用嗎?
// 定義了一個(gè)函數指針類(lèi)型的宏,這樣PFUN就表示指向返回值為int,且同時(shí)帶2個(gè)int參數的函數指針類(lèi)型了。
// 可以用來(lái)定義這樣的變量:
// 比如有個(gè)函數為int fun( int x, int y );
// PFUN p = fun;
//(作者注:我下面給出了更確切的答案) 
--------------------------------------------------------------------------------------------------------------
下面是我的一點(diǎn)補充:
第二題:
int x=35;
char str[10];
strcpy(str,"www.it315.org"/*共13個(gè)字母*/);
//問(wèn):此時(shí)x和strlen(str)的值分別是多少?
答:strlen的值為13,在VC++環(huán)境下,x的值是要改變的(其他編譯器下沒(méi)試,).雖然表面上看來(lái),在程序中并沒(méi)有修改x的值,但是實(shí)際運行的結果是上面的x的值發(fā)生了修改,這是因為strcpy以后,把多余的數據拷貝進(jìn)了str的鄰居(int類(lèi)型的x)中,所以x的數據也就變了.這是一個(gè)曾讓我刻骨銘心的問(wèn)題,在我剛出道時(shí)遇到這個(gè)問(wèn)題,雖然在朋友的幫助下解決了這個(gè)問(wèn)題,但一直不明白x的值為何變了,只有最后走上培訓教師的崗位,才開(kāi)始梳理自己曾經(jīng)的困惑,才開(kāi)始總結以前的經(jīng)驗供學(xué)員們借鑒.我覺(jué)得這個(gè)題目的價(jià)值非常之大,它能引起學(xué)員對字符串拷貝越界問(wèn)題的足夠重視,并且通過(guò)這個(gè)問(wèn)題更能明白字符串的處理是怎么回時(shí),更能明白字符串與字符數組的關(guān)系:字符串就是一個(gè)字符數組,只是把這個(gè)字符數組用在處理串的函數中時(shí),這些函數不考慮數組的長(cháng)度,只是記住數組的首地址,從首地址開(kāi)始處理,并在遇到0時(shí)結束處理,
第四題:
char *pstr;
strcpy(pstr,"http://www.it315.org");
//上句編譯能通過(guò)嗎?運行時(shí)有問(wèn)題嗎?
答: 編譯可以通過(guò),但是pstr沒(méi)有進(jìn)行有效的初始化,它指向了一個(gè)不確定的內存區,運行時(shí)會(huì )出現內存不可寫(xiě)錯誤!
最后一題:
//能明白typedef int (*PFUN)(int x,int y)及其作用嗎?
答:函數指針最大的用處在于它可以被一個(gè)模板方法調用,這是我在學(xué)java的設計模式時(shí)領(lǐng)悟到的.例如,有兩個(gè)函數的流程結構完全一致,只是內部調用的具體函數不同,如下所示:
void func1()
{
         //一段流程代碼和面向方面的代理,如安全檢查,日志記錄等
         int sum = add( x , y);
        //一段流程代碼和面向方面的代理,如安全檢查,日志記錄等
}
void func2()
{
         //與func1完全相同的一段流程代碼和面向方面的代理,如安全檢查,日志記錄等
         int difference = sub( x , y);
        //與func1完全相同的一段流程代碼和面向方面的代理,如安全檢查,日志記錄等
}
那么,可以只定義一個(gè)函數,如下所示
void func(PFUNC p)
{
         //與func1完全相同的一段流程代碼和面向方面的代理,如安全檢查,日志記錄等
         int difference = p( x , y);
        //與func1完全相同的一段流程代碼和面向方面的代理,如安全檢查,日志記錄等
}
調用程序在調用時(shí),讓參數p分別指向add和sub函數就可以了.
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
C/C 程序設計員應聘常見(jiàn)面試試題 strcpy
用printf輸出 STL string數據類(lèi)型
總結:c語(yǔ)言中指針的學(xué)習
VC知識庫文章 - 使用 typedef 抑制劣質(zhì)代碼
typedef的用法
數組傳參的問(wèn)題
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久