首頁 > 軟體

C語言之把陣列名作函數引數的四種情況說明

2022-07-13 18:03:31

把陣列名作函數引數的四種情況

如果想要通過函數呼叫得到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=%fn",a);
}
float add(float a,float b)
{
a=a+b;
printf("輸出子函數的a=%fn",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=%fn",a[0]);
}
float add(float a[],float b)
{
a[0]=a[0]+b;
printf("輸出子函數的a=%fn",a[0]);
}

執行結果:

原理解釋:

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

由程式碼二輸出結果可知,陣列名作函數引數(尤其在子函數中)可通過形參(指標變數)是可以改變實引資料的。這突顯了陣列的普適性,功能性強優於其他一般函數。(個人拙見)

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com