二、【程序員編程】【C語言指針試題】
給你下述C程序代碼:
void exchange1(int para1,int para2)
{
int temp;
temp = para1;
para1 = para2;
para2 = temp;
}
void exchange2(int *pInt1,int *pInt2)
{
int *temp = NULL;
*temp = *pInt1;
*pInt1 = *pInt2;
*pInt2 = *temp;
}
void exchange3(int *pInt1,int *pInt2)
{
int *temp;
temp = pInt1;
pInt1 = pInt2;
pInt2 = temp;
}
void exchange4(int *pInt1,int *pInt2)
{
int temp;
temp = *pInt1;
*pInt1 = *pInt2;
*pInt2 = temp;
}
int main(void)
{
int para1 = 1, para2 = 2;
exchange1(para1, para2);
exchange2(¶1, ¶2);
exchange3(¶1, ¶2);
exchange4(¶1, ¶2);
}
這幾個函數裡,哪幾個函數可以實現main函數中的para1和para2的交換?
1、“己他”概念和“星指組合”概念來解題
這道C語言指針題看上去讓人“眼花繚亂”,其實使用我提出的C語言指針“己他”概念和“星指組合”來解這道題是很簡單的。有關C語言指針的“己他”概念和“星指組合”概念在我的專欄:
的第九章和第十章有詳細的闡述,如下:
第九章:章節九、指針“己X”概念,從這裡開始!(基本數據類型篇)
第十章:章節十、指針“他X”概念,精彩來了!(基本數據類型篇)
這道C語言指針試題就會用到“己他”概念中的“己值”、“他值”和“星指組合”的概念!
簡單來說,這些概念的意思分別如下:
1.1 “己X”概念
“己X”分為己型、己址和己值。
“己型”:就是C語言指針自己的類型;
“己址”:就是C語言指針自己的地址;
“己值”:就是C語言指針自己的數據值;
1.2 “他X”概念
“他X”概念分為他型、他址和他值。
“他型”:就是C語言指針指向的對象的類型;
“他址”:就是C語言指針指向的對象的地址;
“他值”:就是C語言指針指向的對象的數據值;
1.3 “星指組合”概念
“星指組合”就是“星號”+“指針變量”的組合,這種組合的意思就是獲取指針變量的他值!
2、C程序代碼
我來把這道C語言指針題擴展成一段C程序代碼,如下:
二、【程序員編程】【C語言指針試題】
給你下述C程序代碼:
void exchange1(int para1,int para2)
{
int temp;
temp = para1;
para1 = para2;
para2 = temp;
}
void exchange2(int *pInt1,int *pInt2)
{
int *temp = NULL;
*temp = *pInt1;
*pInt1 = *pInt2;
*pInt2 = *temp;
}
void exchange3(int *pInt1,int *pInt2)
{
int *temp;
temp = pInt1;
pInt1 = pInt2;
pInt2 = temp;
}
void exchange4(int *pInt1,int *pInt2)
{
int temp;
temp = *pInt1;
*pInt1 = *pInt2;
*pInt2 = temp;
}
int main(void)
{
int para1 = 1, para2 = 2;
exchange1(para1, para2);
exchange2(¶1, ¶2);
exchange3(¶1, ¶2);
exchange4(¶1, ¶2);
}
這幾個函數裡,哪幾個函數可以實現main函數中的para1和para2的交換?
1、“己他”概念和“星指組合”概念來解題
這道C語言指針題看上去讓人“眼花繚亂”,其實使用我提出的C語言指針“己他”概念和“星指組合”來解這道題是很簡單的。有關C語言指針的“己他”概念和“星指組合”概念在我的專欄:
的第九章和第十章有詳細的闡述,如下:
第九章:章節九、指針“己X”概念,從這裡開始!(基本數據類型篇)
第十章:章節十、指針“他X”概念,精彩來了!(基本數據類型篇)
這道C語言指針試題就會用到“己他”概念中的“己值”、“他值”和“星指組合”的概念!
簡單來說,這些概念的意思分別如下:
1.1 “己X”概念
“己X”分為己型、己址和己值。
“己型”:就是C語言指針自己的類型;
“己址”:就是C語言指針自己的地址;
“己值”:就是C語言指針自己的數據值;
1.2 “他X”概念
“他X”概念分為他型、他址和他值。
“他型”:就是C語言指針指向的對象的類型;
“他址”:就是C語言指針指向的對象的地址;
“他值”:就是C語言指針指向的對象的數據值;
1.3 “星指組合”概念
“星指組合”就是“星號”+“指針變量”的組合,這種組合的意思就是獲取指針變量的他值!
2、C程序代碼
我來把這道C語言指針題擴展成一段C程序代碼,如下:
二、【程序員編程】【C語言指針試題】
給你下述C程序代碼:
void exchange1(int para1,int para2)
{
int temp;
temp = para1;
para1 = para2;
para2 = temp;
}
void exchange2(int *pInt1,int *pInt2)
{
int *temp = NULL;
*temp = *pInt1;
*pInt1 = *pInt2;
*pInt2 = *temp;
}
void exchange3(int *pInt1,int *pInt2)
{
int *temp;
temp = pInt1;
pInt1 = pInt2;
pInt2 = temp;
}
void exchange4(int *pInt1,int *pInt2)
{
int temp;
temp = *pInt1;
*pInt1 = *pInt2;
*pInt2 = temp;
}
int main(void)
{
int para1 = 1, para2 = 2;
exchange1(para1, para2);
exchange2(¶1, ¶2);
exchange3(¶1, ¶2);
exchange4(¶1, ¶2);
}
這幾個函數裡,哪幾個函數可以實現main函數中的para1和para2的交換?
1、“己他”概念和“星指組合”概念來解題
這道C語言指針題看上去讓人“眼花繚亂”,其實使用我提出的C語言指針“己他”概念和“星指組合”來解這道題是很簡單的。有關C語言指針的“己他”概念和“星指組合”概念在我的專欄:
的第九章和第十章有詳細的闡述,如下:
第九章:章節九、指針“己X”概念,從這裡開始!(基本數據類型篇)
第十章:章節十、指針“他X”概念,精彩來了!(基本數據類型篇)
這道C語言指針試題就會用到“己他”概念中的“己值”、“他值”和“星指組合”的概念!
簡單來說,這些概念的意思分別如下:
1.1 “己X”概念
“己X”分為己型、己址和己值。
“己型”:就是C語言指針自己的類型;
“己址”:就是C語言指針自己的地址;
“己值”:就是C語言指針自己的數據值;
1.2 “他X”概念
“他X”概念分為他型、他址和他值。
“他型”:就是C語言指針指向的對象的類型;
“他址”:就是C語言指針指向的對象的地址;
“他值”:就是C語言指針指向的對象的數據值;
1.3 “星指組合”概念
“星指組合”就是“星號”+“指針變量”的組合,這種組合的意思就是獲取指針變量的他值!
2、C程序代碼
我來把這道C語言指針題擴展成一段C程序代碼,如下:
有四個函數,分別試圖交換main函數中的兩個參數,我們來看看運行結果:
二、【程序員編程】【C語言指針試題】
給你下述C程序代碼:
void exchange1(int para1,int para2)
{
int temp;
temp = para1;
para1 = para2;
para2 = temp;
}
void exchange2(int *pInt1,int *pInt2)
{
int *temp = NULL;
*temp = *pInt1;
*pInt1 = *pInt2;
*pInt2 = *temp;
}
void exchange3(int *pInt1,int *pInt2)
{
int *temp;
temp = pInt1;
pInt1 = pInt2;
pInt2 = temp;
}
void exchange4(int *pInt1,int *pInt2)
{
int temp;
temp = *pInt1;
*pInt1 = *pInt2;
*pInt2 = temp;
}
int main(void)
{
int para1 = 1, para2 = 2;
exchange1(para1, para2);
exchange2(¶1, ¶2);
exchange3(¶1, ¶2);
exchange4(¶1, ¶2);
}
這幾個函數裡,哪幾個函數可以實現main函數中的para1和para2的交換?
1、“己他”概念和“星指組合”概念來解題
這道C語言指針題看上去讓人“眼花繚亂”,其實使用我提出的C語言指針“己他”概念和“星指組合”來解這道題是很簡單的。有關C語言指針的“己他”概念和“星指組合”概念在我的專欄:
的第九章和第十章有詳細的闡述,如下:
第九章:章節九、指針“己X”概念,從這裡開始!(基本數據類型篇)
第十章:章節十、指針“他X”概念,精彩來了!(基本數據類型篇)
這道C語言指針試題就會用到“己他”概念中的“己值”、“他值”和“星指組合”的概念!
簡單來說,這些概念的意思分別如下:
1.1 “己X”概念
“己X”分為己型、己址和己值。
“己型”:就是C語言指針自己的類型;
“己址”:就是C語言指針自己的地址;
“己值”:就是C語言指針自己的數據值;
1.2 “他X”概念
“他X”概念分為他型、他址和他值。
“他型”:就是C語言指針指向的對象的類型;
“他址”:就是C語言指針指向的對象的地址;
“他值”:就是C語言指針指向的對象的數據值;
1.3 “星指組合”概念
“星指組合”就是“星號”+“指針變量”的組合,這種組合的意思就是獲取指針變量的他值!
2、C程序代碼
我來把這道C語言指針題擴展成一段C程序代碼,如下:
有四個函數,分別試圖交換main函數中的兩個參數,我們來看看運行結果:
3、C程序代碼分析
3.1 分析1
在C程序代碼的exchange2函數中,參數指針變量pInt1的己值是int變量para1的地址,參數指針變量pInt2的己值是int變量para2的地址。我們來看13行到15行:
第13行:*temp = *pInt1;
第14行: *pInt1 = *pInt2;
第15行: *pInt2 = *temp;
第13行,我們通過“星指組合”拿到了指針變量pInt1的他值和指針變量temp的他值,並且試圖把pInt1的他值給temp的他值!
要知道指針變量temp剛開始的己值是NULL,這是空值的意思,請問此時temp的他值是什麼呢?答案是:內存地址是NULL的這塊地皮上的數據值,至於是什麼數據值,沒人知道,也許是一個非常重要的數據值。那麼你想用pInt1的他值來覆蓋掉這個數據值,操作系統會答應嗎?當然不會,所以在運行的時候會給你一個大大的“運行時”錯誤!
第14行代碼沒問題的,這是通過“星指組合”拿到了指針變量pInt2的他值和指針變量pInt1的他值,並且試圖把pInt2的他值給pInt1的他值,這是可以的!
第15行代碼沒問題的,這是通過“星指組合”拿到了指針變量temp的他值和指針變量pInt2的他值,並且試圖把temp的他值給pInt2的他值,這是可以的!
你看,在main函數中我也把exchange2函數給註釋掉了,因為運行時這個函數肯定運行報錯!
3.2 分析2
在C程序代碼的exchange3函數中,參數指針變量pInt1的己值是int變量para1的地址,參數指針變量pInt2的己值是int變量para2的地址。我們來看20行到22行:
第20行:temp = pInt1;
第21行: pInt1 = pInt2;
第22行: pInt2 = temp;
1)、第20行,我們把指針變量pInt1的己值給了指針變量temp的己值,此時pInt1的己值和temp的己值都是para1的地址;
2)、第21行,我們把指針變量pInt2的己值給了指針變量pInt1的己值,此時pInt1的己值和pInt2的己值都是para2的地址;
3)、第22行,我們把指針變量temp的己值給了指針變量pInt2的己值,此時pInt2的己值和temp的己值都是para1的地址;
經過這三步,最後的結果就是參數指針變量pInt1的己值變成了para2的地址,而參數指針變量pInt2的己值變成了para2的地址,僅僅是pInt1和pInt2的己值發生交換,而para1和para2的值並沒有發生交換。而要實現main函數中para1和para2的交換,必須得是pInt1和pInt2的他值發生交換才行。
3.3 分析3
在C程序代碼的exchange4函數中,參數指針變量pInt1的己值是int變量para1的地址,參數指針變量pInt2的己值是int變量para2的地址。我們來看27行到29行:
第27行:temp = *pInt1;
第28行: *pInt1 = *pInt2;
第29行: *pInt2 = temp;
1)、第27行,我們通過“星指組合”拿到了指針變量pInt1的他值,也就是para1的值:1,並且給了int變量temp。此時指針變量pInt1的他值是1,temp的值也是1;
2)、第28行,我們通過“星指組合”拿到了指針變量pInt1的他值,也就是para1的值:1,pInt2的他值,也就是para2的值:2,並且把pInt2的他值“2”給了pInt1的他值,此時指針變量pInt1的他值,也就是para1的值就變成了2,pInt2的他值,也就是para2的值還是2;
3)、第29行,我們把temp的值1給了通過“星指組合”拿到的指針變量pInt2的他值,也就是para2的值,此時指針變量pInt2的他值就變成1,也就是para2的值變成1;
所以你看exchange4函數中,pInt1和pInt2的他值發生交換,才實現了main函數中para1和para2的交換。而在exchange2和exchange3中均未做到這一點。
三、C語言指針試題總結
這道C語言指針試題看上去難,其實也是繞不開我提出的“己他”概念和“星指組合”概念,所以我一直跟同學們說“C語言指針就是個紙老虎”!