簡體   English   中英

為什么動態分配的int數組在scanf,c語言中使用&?

[英]why dynamic allocated int array use & in scanf, c language?

我了解到 char 數組不要在 scanf 中使用 & 因為 char 存儲點,而不是字符串本身。

char s1[10];
scanf("%s", s1);

但是,為什么動態分配的 int 數組在 scanf 中使用 & ,盡管它使用指針?

int *arr = (int *)malloc(sizeof(int)*3);
scanf("%d", &arr[1]);

這是完全錯誤的:

int arr[3] = (int *)malloc(sizeof(int)*3);

因為您試圖將內存分配給不允許的數組。
它應該是:

int * arr = malloc(sizeof(int)*3);

當你這樣做時,內存中的視圖將是這樣的(假設malloc成功):

    +-----------+
    |   |   |   |
    +-----------+
    ^
    |
   arr

arr是指向內存基地址的指針。
arr[1]是數組的第一個元素(整數數組arr的單個元素)和
&arr[1]是數組arr的第一個元素的地址。

    +-----------+
    |   |   |   |
    +-----------+
        ^
        |
       &arr[1]

當您在數組arr第一個元素中輸入時,您必須將數組的第一個元素的地址傳遞給scanf() ,即&arr[1]

&scanf()參數一起使用與動態分配無關。 如果要在固定長度數組(大小在編譯時確定)的元素中輸入,語法將相同:

int arr[3];

scanf("%d", &arr[1]);

如果您有任何其他問題,請告訴我。

s1是一個字符數組。 數組的名稱 (s1) 是指向 char 的指針,因此您不需要&和 scanf - 因為 %s 期望讀取字符數組。

char s1[10];
scanf("%s", s1);

請注意,在這種情況下,您也可以在 scanf 中指定s1的地址,因為就地址而言, s1, &s1[0], &s1都指向相同的地址。

char s1[10];
scanf("%s", &s1); // work as well

arr是整數數組。 數組的名稱(即arr )也是一個指針(指向 int )是正確的。 但是對於期望讀取整數的 scanf %d,您必須提供您正在讀取的整數的地址。 它不是一個數組,它是 scanf 嘗試讀取的數組的單個整數- 您必須相應地指定它的地址: &arr[1]

int arr[3] = (int *)malloc(sizeof(int)*3);
scanf("%d", &arr[1]);

當您掃描字符(字符串)數組時,在您的情況下 s1,您不需要 & 因為 s1 存儲指向該數組的第一個元素(索引為 0 的元素)的指針。 關於動態分配, malloc 返回值是指向內存中將存儲數組的某個位置的指針。 所以你的聲明應該是這樣的:

int* arr = malloc(sizeof(int) * 3); 
scanf("%d", &add[1]); 
/* here you scanf only the second element of your massive,
 it is int so you have to put & there to pass a pointer */

如果你想初始化整個海量,你可以為它編寫簡單的循環。 我還建議您閱讀一些關於 malloc 的文檔和一篇文章“calloc vs malloc”。

祝你好運 :)

暫無
暫無

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

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