簡體   English   中英

C - 在 function 中將數組引用傳遞給指針參數時出現問題

[英]C - Trouble passing array reference to pointer argument in function

我無法將 integer 數組作為參考傳遞,然后修改原始數組。

#include <stdio.h>

// sets the 2 element of i to 5
void setToFive(int *i[10]){
    *i[2] = 5;
    printf("hello\n");
}

int main(){
    int i[10];
    setToFive(&i);
    // confirm i[2] == 5
    printf("%d\n", i[2]);
}

編譯器抱怨無效類型

[vinessa@komputilo ch1]$ gcc test.c
    test.c: In function ‘setToFive’:
    test.c:5:5: error: invalid type argument of unary ‘*’ (have ‘int’)
        5 |     *i[2] = 5;
          |     ^~~~~
    test.c: In function ‘main’:
    test.c:11:15: warning: passing argument 1 of ‘setToFive’ from incompatible pointer type [-Wincompatible-pointer-types]
       11 |     setToFive(&i);
          |               ^~
          |               |
          |               int (*)[10]
    test.c:4:21: note: expected ‘int *’ but argument is of type ‘int (*)[10]’
        4 | void setToFive(int *i){
          |                ~~~~~^

分段故障

[vinessa@komputilo ch1]$ ./a.out
Segmentation fault (core dumped)

幾個小時以來一直在努力解決問題,請幫忙。

給你

#include <stdio.h>

// sets the 2 element of i to 5
void setToFive(int *i){
    i[2] = 5;
    printf("hello\n");
}

int main(){
    int i[10];
    setToFive(i);
    printf("%d\n", i[2]);
}

如果要更改數組的元素,只需按值傳遞即可。 在這種情況下,數組指示符被隱式轉換為指向其第一個元素的指針。 使用指針和指針算法,您可以更改數組的任何元素。

事實上,在這種情況下,您通過指向它們的指針間接地通過引用傳遞數組元素。

注意這些 function 聲明

void setToFive(int i[100]);
void setToFive(int i[10]);
void setToFive(int i[1]);
void setToFive(int i[]);

是等效的並且聲明相同的一個 function 聲明,編譯器將其調整為以下聲明

void setToFive(int *i);

這就是 function 處理指針的結果。

至於在這個 function 調用中用作參數的表達式

setToFive(&i);

那么它的類型為int ( * )[10]因為指向的數組被聲明為

int i[10];

它與我已經寫過的參數int *i[10]的類型不同,編譯器將其調整為int **類型。

您正在傳遞一個指向整數的指針數組,而不是整數數組。 您可以刪除各種*聲明和運算符,並只需傳遞一個簡單的數組作為參數(數組參數將衰減為指針):

#include <stdio.h>

// sets the 2 element of i to 5
void setToFive(int i[10])
{
    i[2] = 5;
    printf("hello\n");
}

int main()
{
    int i[10];
    setToFive(i);
    // confirm i[2] == 5
    printf("%d\n", i[2]);
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM