繁体   English   中英

记忆中的指针

[英]Pointers in memory

所以我现在正在学习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。所以在查看我的代码之后我想到的问题是:Say我们将2个数字推到堆栈0然后1.现在计数器是2所以在弹出第一个元素之前我们将计数器减1然后返回:

return p->array + p->count;

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

return p->array + p->count;

而不是获得指向地址21的指针,我得到一个指向内存中变量的指针? 语言本身就是这样做的吗? 这是我为可视化我给你的例子而做的一个例子: 在此输入图像描述

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM