[英]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(或當時寫過參考手冊)的人都習慣於使用鑄件,並且這種做法仍然存在。
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.