網(wǎng)站首頁 編程語言 正文
把數(shù)組名作函數(shù)參數(shù)的四種情況
如果想要通過函數(shù)調(diào)用得到n個要改變的值
思路
①在主函數(shù)中設(shè)n個變量,用n個指針變量指向它們
②設(shè)計一個函數(shù),有n個指針形參,在這個函數(shù)中改變這n個形參所指向的值
③在主函數(shù)中調(diào)用這個函數(shù),在調(diào)用時將n個指針變量做為實參,將它們的地址傳給該函數(shù)的形參
④在執(zhí)行該函數(shù)的過程中,通過形參指針變量,改變它們所指向的n個變量的值
⑤主調(diào)函數(shù)中就可以使用這些改變了值的變量
同樣,數(shù)組是一些連續(xù)變量的容器,當(dāng)然也可以通過函數(shù)也改變數(shù)組中的值。
如果有一個實參數(shù)組,想要在函數(shù)中改變此數(shù)組中的元素的值
實參與形參的對應(yīng)關(guān)系有以下四種情況
1.實參和形參都是數(shù)組名
2.實參是數(shù)組名,形參是指針變量
3.實參是指針變量,形參是數(shù)組名
4.實參和形參都是指針變量
我們來看代碼
1.實參和形參都是數(shù)組名
# include <stdio.h>
//實參用屬組名,形參也用數(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ù)組名,形參是指針變量
# include<stdio.h>
//實參用數(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);?? ??? ??? ?//使用指針指向的值進行交換
?? ??? ?*(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.實參和形參都是指針變量
# include<stdio.h>
//使用指針變量作實參,指針變量作形參
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ù)中,無論是使用指針變量還是使用數(shù)組名,改變的只是實參指針變量所指向的變量的值。
牢記一句話(我認為是學(xué)習(xí)指針的重中之重,以不變應(yīng)萬變):
C語言中實參變量和形參變量之間的數(shù)據(jù)傳遞是單向的“值傳遞”方式。用指針變量作函數(shù)參數(shù)同樣要遵循這一規(guī)則。不可能通過執(zhí)行調(diào)用函數(shù)來改變實參指針變量的值,但是可以改變實參指針變量所指向變量的值。?
一般函數(shù)作參數(shù)和數(shù)組名作參數(shù)區(qū)別
此次區(qū)別的分析來源于實踐之后…
代碼示例:
一般函數(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;
}
運行結(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]);
}
運行結(jié)果:
原理解釋:
由代碼一輸出結(jié)果可知,一般函數(shù)作參數(shù)(在子函數(shù)中),其形參數(shù)據(jù)不能夠改變實參數(shù)據(jù)的。所以輸出主函數(shù)的a=3.000000
由代碼二輸出結(jié)果可知,數(shù)組名作函數(shù)參數(shù)(尤其在子函數(shù)中)可通過形參(指針變量)是可以改變實參數(shù)據(jù)的。這突顯了數(shù)組的普適性,功能性強優(yōu)于其他一般函數(shù)。(個人拙見)
原文鏈接:https://blog.csdn.net/magic_guo/article/details/104634699
相關(guān)推薦
- 2022-06-19 python繪制餅圖和直方圖的方法_python
- 2023-03-02 C++版本基于ros將文件夾中的圖像轉(zhuǎn)換為bag包_C 語言
- 2022-05-14 在Pandas?DataFrame中插入一列的方法實例_python
- 2022-02-18 TypeError: ‘Image‘ object does not support item as
- 2023-03-15 Docker網(wǎng)絡(luò)配置及部署SpringCloud項目詳解_docker
- 2022-12-23 Kubernetes應(yīng)用服務(wù)質(zhì)量管理詳解_云其它
- 2023-07-24 利用keyup事件實現(xiàn)input框輸入0-1之間的數(shù)字且最多只能保留2位小數(shù)
- 2023-01-17 Python中的迭代器與生成器使用及說明_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支