记忆中的指针

时间:2014-09-10 00:23:23

标签: c pointers

所以我目前正在学习C,并且我尝试实现自己的基于数组的堆栈。 这是代码:

#include <stdio.h>
#include <stdbool.h>

#define MAX_STACK_SIZE 255

typedef struct
{
    int array[MAX_STACK_SIZE];
    unsigned int count;
    unsigned int max;
} Stack;

void initialize(Stack*);
void push(Stack*, int value);
int* pop(Stack*);
bool isEmpty(Stack*);
bool isFull(Stack*);

int main()
{
    Stack s1;
    initialize(&s1);
    for(int i = 0; i < 7; i++)
    {
        push(&s1, i);
    }
    pop(&s1);
    push(&s1, 88);
    push(&s1, 6);
    int *top;
    while((top = pop(&s1)) != NULL)
    {
        printf("Popping %d from the top of the stack.\n", top);
    }
    return 0;
}

void initialize(Stack *p)
{
    p->count = 0;
    p->max = MAX_STACK_SIZE;
}

void push(Stack *p, int value)
{
    if(!isFull(p))
    {
        p->array[p->count] = value;
        p->count++;
    }
}

int* pop(Stack *p)
{
    if (!isEmpty(p))
    {
        p->count--;
        return p->array + p->count;
    }
    return NULL;
}

bool isEmpty(Stack *p)
{
    return p->count == 0;
}

bool isFull(Stack *p)
{
    return p->count == p->max;
}

因此,在查看我的代码之后,我想到了一个关于pop函数中发生的事情的问题。 在pop函数中,我们返回指向堆栈顶部值的指针。 现在我的方式是:

return p->array + p->count;

其中counter是堆栈中元素的数量,当然我在返回指针之前递减计数器值,因为计数器开始计数1中的元素而不是0。 因此,在审核我的代码后,我想到的问题是: 假设我们将2个数字推到堆栈0然后是1。 现在计数器是2所以在弹出第一个元素之前我们将counter递减为1然后返回:

return p->array + p->count;

在我看来它时,我看到它返回一个指向堆栈中第一个整数地址的指针+另外一个地址。 所以,让我们说数组地址中的第一个整数是20(以十进制表示)所以在我看来我想,好吧这个函数会给我指向地址的指针(20 + 1)所以指向地址的指针21。 现在,如果我错了,请纠正我,但是根据我的理解,每个字节都有一个地址,如果我们返回一个指向地址21的指针,我们返回一个指向地址的指针,该指针是堆栈中第一个整数的/ part /。现在我认为发生了但实际上在运行程序并打印堆栈顶部值的地址时(参见while循环,我打印地址而不是值)我看到减少了每次打印4个(每个int变量占4个字节)。 那究竟是为什么呢?我怎么写

return p->array + p->count;

而不是获取指向地址21的指针,我得到一个指向内存中变量的指针? 语言本身就是这样做的吗? 这是我为了想象我给你的例子而做的一个例子: enter image description here

1 个答案:

答案 0 :(得分:3)

这只是基本的指针算法。向指针添加整数值时,添加的结果是指针的地址增加了它指向的类型的大小乘以整数值。

因此,向类型为int*的指针添加1将使地址增加sizeof(int)个字节(计算机上为4个字节)。将2添加到类型char*的指针将使指针前进2个字节(sizeof(char) == 1))。