В каком моменте проходит адрес памяти и стоимость?

У меня есть эта структура, которую они дали мне примера

typedef struct nodoPila{
    int entry; 
    struct nodoPila *ptrSiguiente; /** Apuntador al siguiente nodo*/
}NodoPila;

typedef NodoPila *ptrNodoPila;

/** Prototipos */

//void createStack(ptrNodoPila);
void push(ptrNodoPila*, int);
int pop(ptrNodoPila*);
bool stackEmpty(ptrNodoPila);
void printStack(ptrNodoPila);
void delStack(ptrNodoPila*); 

Я не разбираюсь очень хорошо в, какой момент делает себе шаг стоимости и шаг ссылке.

У меня есть методы функционируя, только мне нужно, чтобы они объяснили мне, как они функционируют:

/** Insertar un nuevo nodo */
void push(ptrNodoPila *ptrCima, int entry){
    ptrNodoPila ptrNuevo; /** Apuntador al nuevo nodo */
    ptrNuevo = malloc(sizeof(NodoPila));
    /** Inserta el nuevo nodo encima de la pila */
    if(ptrNuevo != NULL){
        ptrNuevo -> entry = entry;
        ptrNuevo -> ptrSiguiente = *ptrCima;
        *ptrCima = ptrNuevo;
    }else{
        printf("%d No se inserto. Memoria insuficiente. \n",entry);
    }
}
/** Devuelve true si la pila esta vacia, de lo contrario false */
bool  stackEmpty(ptrNodoPila ptrCima){
    return ptrCima == NULL;
}
/** Eliminar un nodo de la cima de la pila */
int pop(ptrNodoPila *ptrCima){
    ptrNodoPila ptrTemp; /** Apuntador a un nodo temporal */
    int valorElim; /* Valor del nodo */

    ptrTemp = *ptrCima;
    valorElim = ( *ptrCima )-> entry;
    *ptrCima = ( *ptrCima ) -> ptrSiguiente;
    free(ptrTemp);
    return valorElim;
}

Это часть main....

int main(){
int se =3;
/** Apunta al tope de la pila */
ptrNodoPila ptrPila = NULL;

/** Inserta un elemento */
push(&ptrPila,se);

/**Elimina un elemento*/
if(stackEmpty(ptrPila))
    printf("\n << La pila esta vacia >>\n");
else{ 
    int aux = pop(&ptrPila);
    printf("\n<<< Dato retirado: %d >>>\n",aux);
}
2
задан 29.03.2016, 22:33
1 ответ
typedef NodoPila* ptrNodoPila;

Предыдущая индийская линия, которая ptrNodoPila это указатель. Из-за определения, если ты перемещаешь как параметр указатель, ты используешь ссылки, так как указатель - в самом себе ссылка.

Другая вещь, - если ты перемещаешь указатель из-за стоимости или из-за ссылки. Различие между использованием или другим достаточно ясное:

  • Если ты переместишь указатель из-за стоимости, ты сможешь изменять только информацию, снабженную ссылками вышеупомянутым указателем.
  • Если ты переместишь указатель из-за ссылки, ты сможешь способствовать тому, чтобы указатель указал на другой адрес памяти кроме того, что изменил снабженную ссылками информацию.

Как знать, проходит ли указатель по стоимости или по ссылке? Это очень легко, как ты будешь видеть далее. Чтобы это понимать мы будем обрабатывать информацию изначально с простым типом как один int:

void func1(int variable) // por valor
{
  variable=1;
}
void func2(int* variable) // por referencia
{
  *variable=2;
}

int main()
{
  int var = 0;
  func1(var);
  printf("%d ", var); // 0, pues func1 recibe una copia de var
  func2(&var);
  printf("%d ", var); // 2, pues func2 recibe una referencia a var
}

Поскольку мы видим, чтобы перемещать переменную из-за ссылки, нужно использовать простой указатель. Что происходит с простыми указателями?

void func1(int* variable) // por valor
{
  variable = 1;
}
void func2(int** variable) // por referencia
{
  *variable = 2;
}

int main()
{
  int *ptr = 0;
  func1(ptr);

  // Nota que vamos a imprimir la dirección de memoria a la que apunta
  printf("%d ", ptr); // 0, pues func1 recibe una copia de ptr
  func2(&ptr);
  printf("%d ", ptr); // 2, pues func2 recibe una referencia a ptr
}

Кажется, что главный файл ясный. Для того, чтобы конкретный тип прошел как ссылка, нужно добавлять, что уровень неадреса, а именно, для нормального типа нужен использовать простой указатель, для простого указателя одна двойная порция, для двойного указателя мы нуждаемся в одной тройственности...

Сейчас возвращаясь в твой код:

// El primer parámetro es un puntero doble, ya que ptrNodoPila es un puntero
// El segundo parámetro se pasa por valor
void push(ptrNodoPila*, int);

// El parámetro es un puntero doble
int pop(ptrNodoPila*);

// En los siguientes, parámetro es un puntero simple
bool stackEmpty(ptrNodoPila);
void printStack(ptrNodoPila);

// Y esta función vuelve a trabajar con un puntero doble
void delStack(ptrNodoPila*); 

Приветствие.

4
ответ дан 24.11.2019, 14:40
  • 1
    #161; Превосходный! Не hab и # 237; в прошлое из-за моего разума, который использовал простые и двойные указатели, большое спасибо! – Ramsés Martínez Ortiz 30.03.2016, 03:09