讓我們考慮以下示例:
#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.
考慮一下你的第一個計劃。
在這個程序中,對象
byte
通過指向它的指針通過引用傳遞給函數change_byte
在C中,通過引用傳遞意味著通過指針間接傳遞對象。
所以取消引用作為函數參數聲明的指針
byte
您可以直接訪問main中定義的
int
類型的指向對象byte
。現在讓我們來考慮你的第二個計劃
您主要聲明了一個整數數組
表達式中使用的數組指示符(很少有例外)轉換為指向其第一個元素的指針。
因此,這一呼吁
相當于
因此,取消對函數中指針的引用可以更改main中定義的數組的第一個元素。
但是數組元素存儲在連續的內存中。因此,使用指針算法并擁有指向數組第一個元素的指針,就可以訪問數組的所有元素。
實際上,數組
array
的所有元素都通過指向數組第一個元素的指針通過引用傳遞給函數change_array
。例如,可以像這樣重寫函數中的For循環
現在讓我們考慮一下你的第三個計劃。
正如已經指出的,傳遞給函數
change_array
的數組array
被轉換成指向它的第一個元素的指針。您可以按照以下方式想象函數調用及其定義(我將重命名第一個函數參數,以避免名稱歧義)。
也就是說函數參數是它的局部變量。參數parm_array在函數停止執行之前是活動的。
所以這句話
將指向全局數組
global_array
的第一個元素的指針賦給函數的局部變量array
。這個賦值不會以任何方式觸及main中定義的數組array
。它只更改在函數change_array
中聲明的局部變量array
。為了獲得預期的結果,您可以在main中定義一個由數組
array
初始化的指針。在函數change_array
中,可以用數組global_array
重新分配指針,通過引用將指針傳遞給函數,就像在第一個程序中傳遞對象byte
一樣。這是一個演示程序。
程序輸出為'