所以我目前正在学习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的指针,我得到一个指向内存中变量的指针? 语言本身就是这样做的吗? 这是我为了想象我给你的例子而做的一个例子:
答案 0 :(得分:3)
这只是基本的指针算法。向指针添加整数值时,添加的结果是指针的地址增加了它指向的类型的大小乘以整数值。
因此,向类型为int*
的指针添加1将使地址增加sizeof(int)
个字节(计算机上为4个字节)。将2添加到类型char*
的指针将使指针前进2个字节(sizeof(char) == 1
))。