簡體   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