我对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中没有指向任何东西。任何帮助将不胜感激。
答案 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);