C語(yǔ)言之把數(shù)組名作函數(shù)參數(shù)的四種情況說(shuō)明
把數(shù)組名作函數(shù)參數(shù)的四種情況
如果想要通過(guò)函數(shù)調(diào)用得到n個(gè)要改變的值
思路
①在主函數(shù)中設(shè)n個(gè)變量,用n個(gè)指針變量指向它們
②設(shè)計(jì)一個(gè)函數(shù),有n個(gè)指針形參,在這個(gè)函數(shù)中改變這n個(gè)形參所指向的值
③在主函數(shù)中調(diào)用這個(gè)函數(shù),在調(diào)用時(shí)將n個(gè)指針變量做為實(shí)參,將它們的地址傳給該函數(shù)的形參
④在執(zhí)行該函數(shù)的過(guò)程中,通過(guò)形參指針變量,改變它們所指向的n個(gè)變量的值
⑤主調(diào)函數(shù)中就可以使用這些改變了值的變量
同樣,數(shù)組是一些連續(xù)變量的容器,當(dāng)然也可以通過(guò)函數(shù)也改變數(shù)組中的值。
如果有一個(gè)實(shí)參數(shù)組,想要在函數(shù)中改變此數(shù)組中的元素的值
實(shí)參與形參的對(duì)應(yīng)關(guān)系有以下四種情況
1.實(shí)參和形參都是數(shù)組名
2.實(shí)參是數(shù)組名,形參是指針變量
3.實(shí)參是指針變量,形參是數(shù)組名
4.實(shí)參和形參都是指針變量
我們來(lái)看代碼
1.實(shí)參和形參都是數(shù)組名
# include <stdio.h> //實(shí)參用屬組名,形參也用數(shù)組名 int main(void) { ?? ?void inv(int arr[], int n); ?? ?int array[10], i; ?? ?printf("Please enter ten integer numbers: \n"); ?? ?for (i=0; i<10; i++) ?? ??? ?scanf("%d", &array[i]); ?? ?printf("original array:\n"); ?? ?for (i=0; i<10; i++) ?? ??? ?printf("%2d", array[i]); ?? ?printf("\n"); ?? ?inv(array, 10); ?? ?printf("reversed array:\n"); ?? ?for (i=0; i<10; i++) ?? ??? ?printf("%2d", array[i]); ?? ?printf("\n"); ?? ?return 0; } void inv(int arr[], int n) { ?? ?int temp, m, i; ?? ?m = (n-1)/2 ?? ??? ?; ?? ?for (i=0; i<=m; i++) ?? ?{ ?? ??? ?temp = arr[i]; ?? ??? ?arr[i] = arr[n-1-i]; ?? ??? ?arr[n-1-i] = temp; ?? ?} ?? ? }
2.實(shí)參是數(shù)組名,形參是指針變量
# include<stdio.h> //實(shí)參用數(shù)組名,形參使用指針變量 int main(void) { ?? ?void inv(int * p, int n); ?? ?void inv2(int * p, int n); ?? ?int array[10], i; ?? ?printf("Please enter ten integer numbers: \n"); ?? ?for (i=0; i<10; i++) ?? ??? ?scanf("%d", &array[i]); ?? ?printf("original array:\n"); ?? ?for (i=0; i<10; i++) ?? ??? ?printf("%2d", array[i]); ?? ?printf("\n"); ?? ?inv2(array, 10); ?? ?printf("reversed array:\n"); ?? ?for (i=0; i<10; i++) ?? ??? ?printf("%2d", array[i]); ?? ?printf("\n"); ?? ?return 0; } void inv(int * p, int n) { ?? ?int temp, i, m;?? ??? ??? ??? ?//定義普通變量 ?? ?m = (n-1)/2; ?? ?for (i=0; i<=m; i++) ?? ?{ ?? ??? ?temp = *(p+i);?? ??? ??? ?//使用指針指向的值進(jìn)行交換 ?? ??? ?*(p+i) = *(p+n-1-i);?? ? ?? ??? ?*(p+n-1-i) = temp; ?? ?} } void inv2(int * p, int n) { ?? ?int * i, temp, * j, m;?? ??? ??? ?//定義指針變量 ?? ?j = p+n-1; ?? ?m = (n-1)/2; ?? ?for (i=p; i<p+m; i++, j--) ?? ?{ ?? ??? ?temp = *i;?? ??? ??? ??? ??? ? ?? ??? ?*i = *j; ?? ??? ?*j = temp; ?? ?} }
4.實(shí)參和形參都是指針變量
# include<stdio.h> //使用指針變量作實(shí)參,指針變量作形參 int main(void) { ?? ?void inv3(int * p, int n); ?? ?void inv4(int * p, int n); ?? ?int array[10], i, * p; ?? ?p = array; ?? ?printf("Please enter ten integer numbers: \n"); ?? ?for (i=0; i<10; i++) ?? ??? ?scanf("%d", &array[i]); ?? ?printf("original array:\n"); ?? ?for (i=0; i<10; i++) ?? ??? ?printf("%2d", array[i]); ?? ?printf("\n"); ?? ?inv4(p, 10); ?? ?printf("reversed array:\n"); ?? ?for (i=0; i<10; i++) ?? ??? ?printf("%2d", array[i]); ?? ?printf("\n"); ?? ?return 0; } void inv3(int * p, int n) { ?? ?int i, temp, m; ?? ?m = (n-1)/2; ?? ?for (i=0; i<=m; i++) ?? ?{ ?? ??? ?temp = *(p+i); ?? ??? ?*(p+i) = *(p+n-1-i); ?? ??? ?*(p+n-1-i) = temp; ?? ?} } void inv4(int * p, int n) { ?? ?int * i, * j, temp, m; ?? ?m = (n-1)/2; ?? ?j = p+n-1; ?? ?for (i=p; i<=p+m; i++, j--) ?? ?{ ?? ??? ?temp = *i; ?? ??? ?*i = *j; ?? ??? ?*j = temp; ?? ??? ? ?? ?} }
其中在inv函數(shù)中,無(wú)論是使用指針變量還是使用數(shù)組名,改變的只是實(shí)參指針變量所指向的變量的值。
牢記一句話(我認(rèn)為是學(xué)習(xí)指針的重中之重,以不變應(yīng)萬(wàn)變):
C語(yǔ)言中實(shí)參變量和形參變量之間的數(shù)據(jù)傳遞是單向的“值傳遞”方式。用指針變量作函數(shù)參數(shù)同樣要遵循這一規(guī)則。不可能通過(guò)執(zhí)行調(diào)用函數(shù)來(lái)改變實(shí)參指針變量的值,但是可以改變實(shí)參指針變量所指向變量的值。
一般函數(shù)作參數(shù)和數(shù)組名作參數(shù)區(qū)別
此次區(qū)別的分析來(lái)源于實(shí)踐之后…
代碼示例:
一般函數(shù)作參數(shù)
#include<stdio.h> void main() { float a,b; float add(float a,float b); scanf("%f%f",&a,&b); add(a,b); printf("輸出主函數(shù)的a=%f\n",a); } float add(float a,float b) { a=a+b; printf("輸出子函數(shù)的a=%f\n",a); return a; }
運(yùn)行結(jié)果:
數(shù)組名作函數(shù)參數(shù)
#include<stdio.h> void main() { float a[1],b; float add(float a[],float b); scanf("%f%f",&a[0],&b); add(a,b); printf("輸出主函數(shù)的a=%f\n",a[0]); } float add(float a[],float b) { a[0]=a[0]+b; printf("輸出子函數(shù)的a=%f\n",a[0]); }
運(yùn)行結(jié)果:
原理解釋:
由代碼一輸出結(jié)果可知,一般函數(shù)作參數(shù)(在子函數(shù)中),其形參數(shù)據(jù)不能夠改變實(shí)參數(shù)據(jù)的。所以輸出主函數(shù)的a=3.000000
由代碼二輸出結(jié)果可知,數(shù)組名作函數(shù)參數(shù)(尤其在子函數(shù)中)可通過(guò)形參(指針變量)是可以改變實(shí)參數(shù)據(jù)的。這突顯了數(shù)組的普適性,功能性強(qiáng)優(yōu)于其他一般函數(shù)。(個(gè)人拙見)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言模擬實(shí)現(xiàn)簡(jiǎn)單掃雷游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言模擬實(shí)現(xiàn)簡(jiǎn)單掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10深入C++四種強(qiáng)制類型轉(zhuǎn)換的總結(jié)
本篇文章是對(duì)C++中四種強(qiáng)制類型轉(zhuǎn)換進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C++ 實(shí)現(xiàn)對(duì)象池的具體方法
本文主要介紹了C++ 實(shí)現(xiàn)對(duì)象池的具體方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01嵌入式項(xiàng)目使用C語(yǔ)言結(jié)構(gòu)體位段特性實(shí)現(xiàn)斷言宏校驗(yàn)數(shù)據(jù)范圍有效性的方法
今天小編就為大家分享一篇關(guān)于嵌入式項(xiàng)目使用C語(yǔ)言結(jié)構(gòu)體位段特性實(shí)現(xiàn)斷言宏校驗(yàn)數(shù)據(jù)范圍有效性的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12淺談C++中的mutable和volatile關(guān)鍵字
下面小編就為大家?guī)?lái)一篇淺談C++中的mutable和volatile關(guān)鍵字。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06