¿Cómo se maneja una estructura como variable y como puntero en C y C++?

Hola quisiera saber como se maneja una estructura como variable y como puntero para enviarla de una función a otra, como entrada y entrada /salida

1 respuesta

Respuesta
1
Veamos el tema de punteros en c es peligroso, pero no es tabú, voy a hacer lo posible para que sea entendible, en c++ es mucho más sencillo ya que el preprocesador se encarga de hacer la magia.
Partiendo de una estructura simple:
struct ayuda
{
int m_nidayuda;
const char * m_pcszayuda;
};
struct ayuda stayuda;
Comenzamos, hay muchas formas de hacer las cosas te recomiendo buscar libros y demás, acá hay una pequeña introducción ...
si queres hacerte el loco y inicializar todo en cero podes de dos maneras
ni bien definis la variable,
struct ayuda stayuda = { 0,NULL };
y si tenes/queres un array,
const int n = 2;
struct ayuda stayuda2[n] = { {0, NULL}, {1,"ayuda"}};
y la segunda forma
memset(&stayuda,0,sizeof(stayuda));
Lo más raro de este ejemplo es el ampersant (& o como se escriba) que define algo que podemos llamar "address of" lo cual es básicamente obtiene un puntero a la estructura, y sizeof es una macro de tiempo de compilación que obtiene el tamaño de la estructura.
Después sin ir más lejos,,, para pasar un puntero a un estructura podes hacer cosas como:
const ayuda * payuda = &stayuda;
o tambien usar trampas de cast ( que son un peligro ) para hacer que todo funcione igual
void * p = (void *) &stayuda;
const ayuda * payuda = (const ayuda *) p;
Los casteos son la herramienta más peligrosa pero ´sirven´ para pasar punteros a funciones.
A la hora de crear structuras ( si NO tiene funciones, me refiero a esas estructuras de c++ en las cuales te espermitido overridear operadores y agregarles funciones ) podes también crearlas mediante el calloc y malloc:
const ayuda * payuda = (const ayuda *) calloc(sizeof(ayuda),1);
y si es un array
int n = 2
const ayuda * payuda2 = (const ayuda *) calloc(sizeof(ayuda),n);
a lo que podes jugar con los elemntos del array de muchas maneras.
for (int x = 0; x < n; x++)
{
// forma facil
payuda2[x].m_nidayuda = x;
// forma absurdamente complicada de casteos
(*(struct ayuda *)( payuda2 + ( x * sizeof(ayuda) ) ))).m_nidayuda = x;
// o ...
((struct ayuda *)( payuda2 + ( x * sizeof(ayuda) ) )))->m_nidayuda = x;
}
Después el c++ tiene una forma muy especial de tratar al ampersan (& o como se escriba) que explicada en palabras seria como 'obtener una referencia constante a una estructura' es mejor que un puntero porque no necesitas hacer casteos absurdos ni redundantes y evita hacer operaciones matemáticas con los punteros que es definitivamente un peligro andante,,, y un ejemplo seria una función:
void callayuda(struct ayuda & miayuda)
{
miayuda.m_nidayuda = 8;
}
entonces los llamados a esta funcion:
callayuda(stayuda);
callayuda(*payuda);
callayuda(payuda2[1]);
Etcétera,,, espero haber respondido tu pregunta, pero si tienes más preguntas puntuales no dudes en hacerlas ^^ sin más atentamente. Charlyx.-

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas