函数返回一个指针

时间:2017-10-14 20:49:04

标签: c function pointers

我对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

我很确定我明白这是如何运作的 我正在阅读" C编程语言"由Kernighan和Ritchie提供,但我对他们在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;

这里变量"指针"指向x变量。然而。在函数alloc中没有指向任何东西。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

此功能

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);

然后,分配将返回相同的4字节到'4bytesAgain',它返回'4bytes'!由于内存被释放,'alloc'函数可以自由地重用它。所以如果你现在用这个名字填充这四个字节;

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

然后这会改变原始'4bytes'和'4bytesInt'指向的值。

答案 1 :(得分:0)

char *alloc(int n)表示alloc是一个返回指向char的指针的函数。在这种情况下,它是指向数组的第一个元素的指针,该数组表示由alloc预订的内存块。将*放在alloc旁边可能会有点误导,将其更多地视为char* alloc(int n)

函数名称不是指针,它返回的是 - 就像你写int fun(int x)一样 - 除了返回值不是int而是char *

答案 2 :(得分:0)

这只是意味着无论何时调用该函数,它都会返回指向char的指针。

例如,调用此函数时,您可能会看到如下内容:

char* x;
x = alloc(5);