[C con Clase] Declaración e inicialización de punteros y typedef.
Davidson, Steven
srd4121 en njit.edu
Vie Mar 2 15:54:38 CET 2018
Hola Marcelinux,
1. Como ya sabes, sintácticamente un puntero se define con un astersico y
un array con una pareja de corchetes. El "problema" es que estos
declaradores siguen las reglas de los operadores. Esto implica que las
reglas de precedencia y de asociatividad siguen vigentes. Vemos que el
declarador [] tiene mayor precedencia que el declarador *.
Como queremos un puntero de arrays, debemos obligar que el declarador del
puntero se realice antes que el declarador de arrays. Para obligar usamos
paréntesis; esto es,
¿? (*ptr)[7];
Luego dice que el tipo de cada elemento del array es un puntero a 'int'.
Bien, pues ahora agregamos esta parte:
int * (*ptr)[7];
Cuando uno empieza a hacer este tipo de declaraciones complejas, aconsejo
usar 'typedef' para aclararnos; esto es,
typedef int * tipo_array_ptr[7];
tipo_array_ptr *ptr;
Esto es definitivamente mejor cuando queremos crear memoria dinámicamente
usando 'new' o 'new[]'; por ejemplo,
ptr = new tipo_array_ptr[100];
2. Esto no tiene mucho misterio. Solamente necesitas ir poco a poco:
array de 8 elementos:
¿? array[8];
cada elemento es un array de 7 elementos:
¿? array[8][7];
que a su vez cada elemento es un puntero a 'int':
int * array[8][7];
Espero haber aclarado las dudas.
Steven
On Fri, Mar 2, 2018 at 3:59 AM, marcelinux <marcelinator en gmail.com> wrote:
> Después de completar el curso propuesto en esta web me he propuesto
> complementarlo con el libro de Bjarne Stroustrup, The C++ Programming
> language.
> En el capítulo 5 se proponen unos ejercicios, que transcribo.
> Me gustaría saber si los he realizado correctamente.
> No se me ocurre cómo serían las dos últimas definiciones. Si alguien
> pudiera
> explicarme cómo deberían ser, le estaría muy agradecido.
> <code>
> /* The C++ Programming language
> * Ejercicios del capítulo 5.
> *
> * ej_01 Write declarations for the following:
> * a pointer to a character,
> * an array of 10 integers,
> * a reference to an array of 10 integers,
> * a pointer to an array of character strings,
> * a pointer to a pointer to a character,
> * a constant integer,
> * a pointer to a constant integer
> * and a constant pointer to an integer.
> * Initialize each one.
> *
> * ej_03 Use typedef to define the types:
> * unsigned char,
> * const unsigned char,
> * pointer to integer,
> * pointer to pointer to char,
> * pointer to arrays of char,
> * array of 7 pointers to int,
> * pointer to an array of 7 pointers to int
> * and array of 8 arrays of 7 pointers to int.
> */
>
> #include iostream
> using namespace std;
>
> void ej_01()
> {
> char c = 'M';
> cout << "char c = " << c << '\n';
>
> // a pointer to a character
> char* pc = &c;
> cout << "char* pc = " << pc << " apunta a c = " << *pc << '\n';
>
> // an array of 10 integers
> int arr_i[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 32};
> cout << "arr_i[10] ... " << arr_i[0] << '\n';
>
> // a reference to an array of 10 integers
> int (&ref_i)[10] = arr_i;
> cout << "ref_i = " << ref_i << " hace referencia a " << ref_i[0]
> << '\n';
>
> // a pointer to an array of character strings
> char* arr_c[] = {"primero",
> "segundo",
> "tercero"};
> cout << "arr_c[] ... " << arr_c[0] << " .. o .. " << *arr_c <<
> '\n';
>
> // a pointer to a pointer to a character
> char** ppc = arr_c;
> cout << "ppc = " << ppc << " que apunta a " << *ppc << '\n';
>
> // a constant integer
> const int ci = 356;
> cout << "ci = " << ci << '\n';
>
> // a pointer to a constant integer
> const int* pci = &ci;
> cout << "pci = " << pci << " que apunta a " << *pci << '\n';
>
> // a constant pointer to an integer
> int ii = 88;
> int *const icons = ⅈ
> cout << "icons = " << icons << " que apunta a " << *icons << '\n';
> }
>
> void ej_03()
> {
> // unsigned char
> typedef unsigned char uchar_t;
> uchar_t uc = 179;
> cout << "unsigned char 179 se representa con " << uc << '\n';
>
> // const unsigned char
> typedef const unsigned char cuchar_t;
> cuchar_t cuc = 179;
> cout << "const unsigned char 179 se representa con " << cuc <<
> '\n';
>
> //pointer to integer
> typedef int* pint_t;
> int i = 6;
> pint_t pi = &i;
> cout << "pointer to integer sobre i = 6 está en " << pi << " y
> contiene " << *pi << '\n';
>
> //pointer to pointer to char
> typedef char** ppchar_t;
> char ch1 = 'c';
> char* pch1 = &ch1;
> ppchar_t ppch1 = &pch1;
> cout << "pointer to pointer to char está en " << ppch1
> << " y contiene " << *ppch1
> << " que es, a su vez " << **ppch1 << '\n';
>
> // pointer to arrays of char --->>> es equivalente a pointer to
> pointer to char
>
> //array of 7 pointers to int
> int i7_1, i7_2, i7_3, i7_4, i7_5, i7_6, i7_7;
> i7_7 = i7_6 = i7_5 = i7_4 = i7_3 = i7_2 = i7_1 = 101;
> typedef int* pint7_t;
> pint7_t i7[7] = {&i7_1, &i7_2, &i7_3, &i7_4, &i7_5, &i7_6, &i7_7};
> cout << "array of 7 pointers to int: " << i7[0] << " => " << *i7[0]
> << ", " << i7[1] << " => " << *i7[1]
> << ", " << i7[2] << " => " << *i7[2]
> << ", " << i7[3] << " => " << *i7[3]
> << ", " << i7[4] << " => " << *i7[4]
> << ", " << i7[5] << " => " << *i7[5]
> << ", " << i7[6] << " => " << *i7[6] << '\n';
>
> //pointer to an array of 7 pointers to int
>
> //array of 8 arrays of 7 pointers to int
> }
>
> int main()
> {
> ej_01();
> ej_03();
> return 0;
> }
> </code>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20180302/2ffcd24c/attachment-0001.html>
Más información sobre la lista de distribución Cconclase