'程序員編程C語言指針答疑:值傳遞 PK 址傳遞'

C語言 程序員 文章 操作系統 C語言編程答疑 2019-07-28
"

一、程序員編程C語言答疑合集

更多C語言學習答疑文章,請參閱:程序員編程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(&para1, &para2);
exchange3(&para1, &para2);
exchange4(&para1, &para2);
}

這幾個函數裡,哪幾個函數可以實現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語言學習答疑文章,請參閱:程序員編程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(&para1, &para2);
exchange3(&para1, &para2);
exchange4(&para1, &para2);
}

這幾個函數裡,哪幾個函數可以實現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語言指針答疑:值傳遞 PK 址傳遞

C函數定義

"

一、程序員編程C語言答疑合集

更多C語言學習答疑文章,請參閱:程序員編程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(&para1, &para2);
exchange3(&para1, &para2);
exchange4(&para1, &para2);
}

這幾個函數裡,哪幾個函數可以實現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語言指針答疑:值傳遞 PK 址傳遞

C函數定義

程序員編程C語言指針答疑:值傳遞 PK 址傳遞

C程序

有四個函數,分別試圖交換main函數中的兩個參數,我們來看看運行結果:

"

一、程序員編程C語言答疑合集

更多C語言學習答疑文章,請參閱:程序員編程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(&para1, &para2);
exchange3(&para1, &para2);
exchange4(&para1, &para2);
}

這幾個函數裡,哪幾個函數可以實現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語言指針答疑:值傳遞 PK 址傳遞

C函數定義

程序員編程C語言指針答疑:值傳遞 PK 址傳遞

C程序

有四個函數,分別試圖交換main函數中的兩個參數,我們來看看運行結果:

程序員編程C語言指針答疑:值傳遞 PK 址傳遞

C程序運行結果

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語言指針就是個紙老虎”!

"

相關推薦

推薦中...