簡體   English   中英

為什么在 int 之后使用星號 (*)? ptr = (int*) malloc (100 * sizeof(int));

[英]Why asterisk (*) is used after int? ptr = (int*) malloc (100 * sizeof(int));

malloc()分配 memory 並返回它的起始地址,所以如果我們想將該地址分配給一個int指針,我們不應該只使用(int)而不是(int*)進行類型轉換嗎? 它只是返回一個void類型的地址,它是一個地址,所以它肯定會被分配給一個指針,那么為什么我們在類型轉換中在int之后添加*呢?

那么為什么我們在類型轉換中在 int 之后添加 * 呢?

因為*是類型的一部分。 int*是一個指針,而int是一個 integer。 它們是兩種不同的東西。

此外,如果您查看malloc的文檔(例如),您會發現它返回一個void* 還有*被用來聲明它是一個指針。 因此,從一種類型的指針轉換為另一種類型的指針,使用類型中的*

malloc之前的(int *)是一個強制轉換- 這意味着“將malloc的返回值視為指向int的指針”。

自 1989 年標准以來,C 1 - malloc返回一個類型為“指向void的指針”( void * ) 的值,可以將其分配給不同指針類型的對象,我們大多數人都建議不要使用它(它增加了雜亂無章的好處並增加了維護負擔)。

在 1989 年標准malloc返回“指向char的指針”( char * )之前,如果沒有強制類型轉換,則無法將其分配給其他指針類型。 任何在 80 年代初寫過 C(或當時寫過參考手冊)的人都習慣於使用鑄件,並且這種做法仍然存在。


  1. C++ 中不是這種情況 - C++ 不允許從void *隱式轉換為其他指針類型,因此需要強制轉換。 但是,如果您正在編寫 C++,則首先不應使用malloc

我相信每個人都對這個問題有自己最喜歡的答案,但我認為如果您意識到 CPU 上的所有內容基本上只是指向 memory 地址的指針,這會有所幫助。 CPU 本身有一組非常小的“寄存器”可以使用,而獲得任何數據結構的方法是遵循 memory 指針。 類型只對程序員和編譯器強制執行的計算機語言有意義,只是一種組織和跟蹤事物的方式。 這對 CPU 沒有任何意義。

在 C/C++ 中,語言的設計試圖使這一現實(在匯編語言和機器代碼中不可避免)易於訪問。 這就是為什么它長期以來一直是一種流行的“系統語言”的原因之一。

malloc所做的所有操作都預留了一塊系統 memory,它至少與您要求的字節大小一樣大,並返回該 memory 的起始地址。 它根本不知道它是什么類型 它可能是您用於堆 memory 中的結構的空間。 它可以是整數數組、浮點數數組或某種結構的數組。 調用 malloc 之后的“演員表”是為了讓語言程序員記住您打算使用 memory 的類型。

int* ptr = (int *)malloc(100 * sizeof(int));

你知道它是一個指向足夠 memory 100 個整數的指針,所以你可以將它用作ptr[x] ,其中 x 是 0..99 安全。 您可以將其用作*ptr ,也可以將其用作*ptr++ ,只要您只執行 100 次即可。 在這種情況下,計算機語言本身沒有關於ptr的更多信息,除了它是一個指向 int 的指針。

雖然您也可以在 C++ 中使用此語法,但有一種安全的方法可以避免一些混亂,但最終它做的事情完全相同: int* ptr = new int[100]; .

C++ 程序員會建議您使用std::array<int, 100>std::vector<int>和/或std::unique_ptr<int[]>之類的東西,它們更“有條理”和“類型安全” ',但最終 CPU 仍然對 memory 地址做同樣的事情。

The original The C Programming Language by Brian Kernighan & Dennis Ritchie is a great way to get started on any version of C or C++, or frankly any of the many other languages that all borrow heavily from the C language design.

Memory 在嵌入式進程或 controller 中實現此代碼時需要檢查

int *ptr;  // pointer declaration

ptr = malloc(100 * sizeof(int));  // create an array of 100 int pointers

if(prt == null)
{
  printf("memory failed \n");  //can't process
  return ;
}

for (i = 0; i < 25; i++)  // fill it like a standard array
    ptr[i] = i;

for (i = 0; i < 25; i++)  // process it
    printf("%d\n", ptr[i]);     

free(ptr);  // clean up

使用 malloc 您正在定義一個數組,在您的情況下,您正在定義一個包含 100 個 integer 類型元素的數組。 您正在為使用 100 個 integer 類型元素的元素保留 memory。

暫無
暫無

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

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