簡體   English   中英

函數返回一個指針

[英]function returns a pointer

我對C很陌生,我很難掌握所有這些指針。 換句話說,解除引用運算符和&符號運算符。 我相信,在盯着他們看了一會兒后,我開始明白他們是如何運作的。 例如:

    int x = 1;            //this creates an integer variable called x and assigns one to it
    int *pointer;     //this creates a pointer variable that will point to an integer
    pointer = &x;     //now the variable pointer points to x
    *pointer = 0      //the value that pointer points to is now zero

我很確定我明白這是如何運作的。
我正在閱讀Kernighan和Ritchie的“C編程語言”,但我對他們在5.4節(地址算法)中的一些代碼感到困惑。 我應該指出,我理解地址算術,所以我的問題與此無關。 關於下面函數中的代碼我的問題也不是。 在線搜索有關此代碼的問題會產生大量帖子,人們無法理解if / else語句中的代碼如何運作。 在任何情況下,我的問題都是關於函數名稱本身。

    #define ALLOCSIZE 1000
    static char allocbuf[ALLOCSIZE];
    static char *allocp = allocbuf;

    char *alloc(int n)  /*return pointer to n charachters*/
    {
          if (allocbuf + ALLOCSIZE - allocp >=n)
             {
             allocp += n;
             return  allocp - n;
             }
          else
             return 0;
    }

同樣,我理解函數中的代碼,但是如何實現

*alloc

工作? 我理解這個函數返回一個指針。 這是否意味着通過將函數名稱作為指針,我們返回一個指向char類型的指針? 如果是這樣,它指的是什么? 在我之前的例子中,我們有

    int x = 1;
    int *pointer;
    pointer  = &x;

這里變量“pointer”指向x變量。 然而。 在函數alloc中沒有指向任何東西。 任何幫助,將不勝感激。

這個功能

char *alloc(int n)  /*return pointer to n charachters*/

將返回指向字符的指針

如果以這種方式編寫它可能更容易理解:

char* alloc(int n)  //subtle, but this change in format can help

現在,關於指針實際指向的內容。 以前,在這條線上;

#define ALLOCSIZE 1000
static char allocbuf[ALLOCSIZE];

創建一個大小為1000的char數組。 我們有一個包含1,000個字符的數組,名稱'allocbuf'指向數組中的第一個元素。 接下來,在這條線上;

static char *allocp = allocbuf;

我們為1,000 char數組(allocbuf)的第一個元素創建一個指針(allocp)。 數組和指針都是全局變量。 它們可以在程序的任何地方訪問。 在您發布的示例中,這些變量將在alloc函數中使用。

在我們繼續之前,定義函數的用途是有意義的。 目的是使用先前定義的1000字符數組(它可以幫助您將char視為單個字節)來分配內存。 因此該函數將跟蹤已使用的內存。 並返回一個指向可以使用的大小為'n'的塊的指針(如果沒有足夠的內存,則返回null'0')。

不要擔心在這個例子中如何釋放內存。 我重讀了你從這個例子中提取的部分,然后它定義了一個名為'afree'的方法來釋放這個函數分配的內存。

該函數通過每次請求內存時將'alloc'(指向1000個字符數組的指針)遞增'n'(請求的大小)來跟蹤已使用的內存。 然后,當函數的用戶請求更多內存時,它會檢查以確保這些行可以滿足請求;

if (allocbuf + ALLOCSIZE – allocp >= n)
    …
else{
    return 0;
}

如果請求的大小不合適,則返回null。 該函數利用'allocp'的當前位置來確定先前調用是否有足夠的內存。 如果要求的尺寸合適,則會發生這種情況;

allocp += n;
return allocp – n;

這樣做是通過請求大量內存來增加'allocp'。 此指針用於跟蹤已請求此功能的內存量。 由於該函數可以滿足內存請求,因此它現在認為所請求的內存正在使用中。 因此,指針現在指向未使用的1000個char數組中的第一個char。 然后,在遞增指針之后,該函數通過從'allocp'的當前位置減去'n'(請求的大小)返回指向所請求的內存塊的第一個char的指針。

在所有這些中,沒有人知道這個記憶的價值究竟是什么。 沒有人知道allocbuf [13]或allocbuf [314]包含什么。 此函數僅管理哪些內存是空閑的以及所執行的內容,它不關心實際存儲在內存中的內容。

如果用戶要求4個字節,那么

char* 4bytes = alloc(4)

像這樣存儲一個32位的int;

//don’t ever actually do this!!!
int* 4bytesInt = (int*)4bytes;
*4bytesInt = 2,147,483,647;

然后allocbuf的前四個元素包含該整數。 如果你釋放記憶;

afree(4bytes);

然后指針仍然有效,而allocbuf的前4個元素仍包含該整數。 實際上沒有任何東西改變了這些字節的值。 但是,如果再次請求內存

char* 4bytesAgain = alloc(4);

然后,alloc將返回相同的4字節到'4bytesAgain',它返回'4bytes'! 由於內存被釋放,'alloc'函數可以自由地重用它。 所以,如果你現在用這個名字填充這四個字節;

4bytesAgain[0] = ‘C’;
4bytesAgain[1] = ‘A’;   
4bytesAgain[2] = ‘R’;
4bytesAgain[3] = ‘L’;

那么這將改變原始'4bytes'和'4bytesInt'指向的值。

char *alloc(int n)表示alloc是一個返回指向char的指針的函數。 在這種情況下,它是指向數組的第一個元素的指針,該數組表示由alloc預訂的內存塊。 *放在alloc旁邊可能會有點誤導,把它想象成char* alloc(int n)

函數名不是指針,它返回的是 - 就像你寫int fun(int x) - 除了這里返回值不是int而是char *

它只是意味着無論何時調用該函數,它都會返回一個指向char的指針。

例如,調用此函數時,您可能會看到如下內容:

char* x;
x = alloc(5);

暫無
暫無

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

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