如何在C中修改函數中的數組

讓我們考慮以下示例:

#include <stdio.h>

void change_byte(int *byte);

int main()
{
    int byte = 0;
    change_byte(&byte);
    printf("Byte : %d \r\n", byte);
}

void change_byte(int *byte)
{
    *byte= 5;
}

我只是通過將整數作為指向函數的指針來改變函數中整數的值。它產生:

Byte : 5

Everything's fine.


我想將函數推廣為修改整數數組而不是整數。代碼如下:

#include <stdio.h>
#define SIZE_ARRAY 10

void change_array(int *array, int size);

int main()
{
    int array[SIZE_ARRAY] = {0};
    change_array(array, SIZE_ARRAY);
    
    printf("Array : ");
    for(int i = 0 ; i < SIZE_ARRAY ; i++)
    {
        printf("%d ", array[i]);
    }
}

void change_array(int *array, int size)
{
    for(int i = 0 ; i < size ; i++)
    {
        array[i] = 5;
    }
}

它產生:

Array : 5 5 5 5 5 5 5 5 5 5 

我喜歡它,因為它不使用動態分配,但我很難理解它是如何工作的。據我所知,數組在進入函數change_array時被轉換成指針。但是當我在上一個例子中改變byte的值時,我做的是*byte=5。這里,我做的是array[I]=5,而不是*array[I]=5。


最后,我想將前面的示例更改為基于全局數組修改數組:

#include <stdio.h>
#define SIZE_ARRAY 10

int global_array[10] = {5, 5, 5, 5, 5, 5, 5, 5, 5, 5};

void change_array(int *array, int size);

int main()
{
    int array[SIZE_ARRAY] = {0};
    change_array(array, SIZE_ARRAY);
    
    printf("Array : ");
    for(int i = 0 ; i < SIZE_ARRAY ; i++)
    {
        printf("%d ", array[i]);
    }
}

void change_array(int *array, int size)
{
    array = global_array;
}

它產生:

Array : 0 0 0 0 0 0 0 0 0 0   

為什么會這樣?我需要改變什么才能讓它工作?

Thanks.

? 最佳回答:

考慮一下你的第一個計劃。

#include <stdio.h>

void change_byte(int *byte);

int main()
{
    int byte = 0;
    change_byte(&byte);
    printf("Byte : %d \r\n", byte);
}

void change_byte(int *byte)
{
    *byte= 5;
}

在這個程序中,對象byte通過指向它的指針通過引用傳遞給函數change_byte

change_byte(&byte);

在C中,通過引用傳遞意味著通過指針間接傳遞對象。

所以取消引用作為函數參數聲明的指針byte

void change_byte(int *byte);

您可以直接訪問main中定義的int類型的指向對象byte

現在讓我們來考慮你的第二個計劃

#include <stdio.h>
#define SIZE_ARRAY 10

void change_array(int *array, int size);

int main()
{
    int array[SIZE_ARRAY] = {0};
    change_array(array, SIZE_ARRAY);
    
    printf("Array : ");
    for(int i = 0 ; i < SIZE_ARRAY ; i++)
    {
        printf("%d ", array[i]);
    }
}

void change_array(int *array, int size)
{
    for(int i = 0 ; i < size ; i++)
    {
        array[i] = 5;
    }
}

您主要聲明了一個整數數組

int array[SIZE_ARRAY] = {0};

表達式中使用的數組指示符(很少有例外)轉換為指向其第一個元素的指針。

因此,這一呼吁

change_array(array, SIZE_ARRAY);

相當于

change_array( &array[0], SIZE_ARRAY);

因此,取消對函數中指針的引用可以更改main中定義的數組的第一個元素。

但是數組元素存儲在連續的內存中。因此,使用指針算法并擁有指向數組第一個元素的指針,就可以訪問數組的所有元素。

實際上,數組array的所有元素都通過指向數組第一個元素的指針通過引用傳遞給函數change_array

例如,可以像這樣重寫函數中的For循環

    for(int i = 0 ; i < size ; i++)
    {
        *( array + i ) = 5;
    }

現在讓我們考慮一下你的第三個計劃。

#include <stdio.h>
#define SIZE_ARRAY 10

int global_array[10] = {5, 5, 5, 5, 5, 5, 5, 5, 5, 5};

void change_array(int *array, int size);

int main()
{
    int array[SIZE_ARRAY] = {0};
    change_array(array, SIZE_ARRAY);
    
    printf("Array : ");
    for(int i = 0 ; i < SIZE_ARRAY ; i++)
    {
        printf("%d ", array[i]);
    }
}

void change_array(int *array, int size)
{
    array = global_array;
}

正如已經指出的,傳遞給函數change_array的數組array被轉換成指向它的第一個元素的指針。

您可以按照以下方式想象函數調用及其定義(我將重命名第一個函數參數,以避免名稱歧義)。

change_array(array, SIZE_ARRAY);

//...

void change_array( /* int *parm_array, int size */)
{
    int * parm_array = array;
    int size = SIZE_ARRAY;

    array = global_array;
}

也就是說函數參數是它的局部變量。參數parm_array在函數停止執行之前是活動的。

所以這句話

    array = global_array;

將指向全局數組global_array的第一個元素的指針賦給函數的局部變量array。這個賦值不會以任何方式觸及main中定義的數組array。它只更改在函數change_array中聲明的局部變量array

為了獲得預期的結果,您可以在main中定義一個由數組array初始化的指針。在函數change_array中,可以用數組global_array重新分配指針,通過引用將指針傳遞給函數,就像在第一個程序中傳遞對象byte一樣。

這是一個演示程序。

#include <stdio.h>
#define SIZE_ARRAY 10

int global_array[10] = {5, 5, 5, 5, 5, 5, 5, 5, 5, 5};

void change_array( int **array_ptr );

int main()
{
    int array[SIZE_ARRAY] = {0};
    int *array_ptr = array;
    
    change_array( &array_ptr );
    
    printf("Array : ");
    for(int i = 0 ; i < SIZE_ARRAY ; i++)
    {
        printf("%d ", array_ptr[i]);
    }
}

void change_array( int **array_ptr )
{
    *array_ptr = global_array;
}

程序輸出為'

Array : 5 5 5 5 5 5 5 5 5 5 
主站蜘蛛池模板: 亚洲乱码日产一区三区| 久久久久人妻精品一区三寸| 亚洲日本一区二区一本一道| 深夜福利一区二区| 亚洲AV无码一区二区三区在线| 国产精品视频免费一区二区三区| 国产自产V一区二区三区C| 国产乱码精品一区三上| 精品国产一区二区三区麻豆| 国产精品被窝福利一区 | 日本精品一区二区三区四区| 久久亚洲日韩精品一区二区三区| 亚洲AV无码一区二区三区在线观看 | 亚洲一区精品视频在线| 国产AV一区二区三区无码野战| 无码精品人妻一区二区三区AV| 无码中文字幕一区二区三区| 久久久老熟女一区二区三区| 国产综合无码一区二区辣椒| 精品一区二区高清在线观看| 一区二区国产在线观看| 国产美女av在线一区| 精品福利一区二区三区精品国产第一国产综合精品 | 久久毛片免费看一区二区三区| 国产大秀视频在线一区二区| 高清精品一区二区三区一区| 精品无人区一区二区三区| 99精品国产高清一区二区麻豆 | 国产一区二区三精品久久久无广告| 国产在线精品一区二区高清不卡 | 全国精品一区二区在线观看| 日韩人妻无码一区二区三区综合部| 国产亚洲一区二区三区在线不卡| 色狠狠一区二区三区香蕉蜜桃| 中文字幕一区二区三| 国产伦精品一区二区三区女| 免费看无码自慰一区二区| 久久国产精品一区| 国产精品日韩欧美一区二区三区 | 中文人妻无码一区二区三区 | 无码日韩AV一区二区三区|