日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C語言之把數組名作函數參數的四種情況說明_C 語言

作者:慢生活的人。 ? 更新時間: 2022-09-05 編程語言

把數組名作函數參數的四種情況

如果想要通過函數調用得到n個要改變的值

思路

①在主函數中設n個變量,用n個指針變量指向它們

②設計一個函數,有n個指針形參,在這個函數中改變這n個形參所指向的值

③在主函數中調用這個函數,在調用時將n個指針變量做為實參,將它們的地址傳給該函數的形參

④在執行該函數的過程中,通過形參指針變量,改變它們所指向的n個變量的值

⑤主調函數中就可以使用這些改變了值的變量

同樣,數組是一些連續變量的容器,當然也可以通過函數也改變數組中的值。

如果有一個實參數組,想要在函數中改變此數組中的元素的值

實參與形參的對應關系有以下四種情況

1.實參和形參都是數組名

2.實參是數組名,形參是指針變量

3.實參是指針變量,形參是數組名

4.實參和形參都是指針變量

我們來看代碼

1.實參和形參都是數組名

# include <stdio.h>
//實參用屬組名,形參也用數組名
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.實參是數組名,形參是指針變量

# include<stdio.h>
//實參用數組名,形參使用指針變量
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函數中,無論是使用指針變量還是使用數組名,改變的只是實參指針變量所指向的變量的值。

牢記一句話(我認為是學習指針的重中之重,以不變應萬變):

C語言中實參變量和形參變量之間的數據傳遞是單向的“值傳遞”方式。用指針變量作函數參數同樣要遵循這一規則。不可能通過執行調用函數來改變實參指針變量的值,但是可以改變實參指針變量所指向變量的值。?

一般函數作參數和數組名作參數區別

此次區別的分析來源于實踐之后…

代碼示例:

一般函數作參數

#include<stdio.h>
void main()
{
float a,b;
float add(float a,float b);
scanf("%f%f",&a,&b);
add(a,b);
printf("輸出主函數的a=%f\n",a);
}
float add(float a,float b)
{
a=a+b;
printf("輸出子函數的a=%f\n",a);
return a;
}

運行結果:

數組名作函數參數

#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("輸出主函數的a=%f\n",a[0]);
}
float add(float a[],float b)
{
a[0]=a[0]+b;
printf("輸出子函數的a=%f\n",a[0]);
}

運行結果:

原理解釋:

由代碼一輸出結果可知,一般函數作參數(在子函數中),其形參數據不能夠改變實參數據的。所以輸出主函數的a=3.000000

由代碼二輸出結果可知,數組名作函數參數(尤其在子函數中)可通過形參(指針變量)是可以改變實參數據的。這突顯了數組的普適性,功能性強優于其他一般函數。(個人拙見)

原文鏈接:https://blog.csdn.net/magic_guo/article/details/104634699

欄目分類
最近更新