double a[20];
/* a == &a[0] */
a[0] == *a == 3
a[1] == *(a+1) == 4
a[2] == *(a+2) == 7
a[3] == *(a+3) == 2
...
a[9] == *(a+9) == 6
int i, *pA;
int arreglo[10] = {3, 2, 4, 6, 8, 1, 3, 5, 7, 9};
pA = arreglo;
printf("%d,%d\n", *pA, arreglo[0]);
/* Al contenido de *pA (arreglo[0]) le suma i */
for(i=0; i < 10; i++)
printf("%d, %d\n", arreglo[i], *pA+i);
for(i=0; i < 10; i++)
printf("%d, %d\n", arreglo[i], *(pA+i));
/* Equivalente a arreglo[i] */
pc = pv = NULL;
Nota1: Es importante inicializar los punteros para evitar los "punteros descontrolados". ¡Las variables en C no se inicializan solas!
Nota2: En realidad la dirección de memoria 0x0 existe, pero siempre esta reservada para fines específicos de la arquitectura. Por esto el lenguaje C lo considera como un puntero especial a nada.
#include <stdio.h>
// Headers de C99 para enteros
#include <inttypes.h>
#include <stdint.h>
void main(void) {
char c='a';
char *pc=&c;
// Forma normal (no imprime los ceros del principio)
printf("Address: %p\n",pc);
printf("Address: %#lx\n",pc);
// Usando tipos enteros de ancho fijo (C99)
printf("Address: 0x%016" PRIxPTR "\n", (uintptr_t)pc);
}
Nota: En cppreference.com se puede leer más sobre
tipos de enteros de ancho fijo (C99)
float a;
int b;
a = 4 + 4.0 -> 4.0 + 4.0 -> 8.0
b = 3.5 + 3 -> 3.5 + 3.0 -> 6.5 -> 6
(float) 1 -> 1.0
(int) 1.5 -> 1
int tabla[3];
int *pi;
char *pc;
pi = tabla;
*pi = 97;
*(pi+1) = 98;
pc = (char *) pi;
*pc = 'x';
*(pc+1) = 'y';
Ejemplo listo para correr y con salida por consola
#include <stdio.h>
void main(void) {
char *pc=NULL;
int *pi=NULL;
printf("Mi puntero a char ocupa: %d bytes\n",
(int)(sizeof(pc)));
printf("Mi puntero a int ocupa: %d bytes\n",
(int)(sizeof(pi)));
}
sizeof también puede averiguar el tamaño de un array:
#include <stdio.h>
void main(void) {
char cadena[] = "Mi string de prueba";
int vector[] = {0, 2, 4, 6, 8, 1, 3, 5, 7, 9};
printf("Mi \"cadena\" tiene %d caracteres\n",
(int)(sizeof(cadena)/sizeof(char)));
printf("Mi \"vector\" tiene %d posiciones\n",
(int)(sizeof(vector)/sizeof(int)));
}
Como el sizeof lo hace el compilador el lo sabe por que también maneja la declaración. Pero la variable debe haber sido declarada explicitamente como un vector:
char string[32] = "hello, world";
char *ptr = string;
Si estamos en una máquina de 64bits (con punteros de 8 bytes)
{tipo-base} {identificador}[{NumElem1}][{NumElem2}];
tipo-base identif[M][N] = {
{valor0_0, valor0_1, ..., valor0_N-1},
{valor1_0, valor1_1, ..., valor1_N-1},
{valor2_0, valor2_1, ..., valor2_N-1},
...,
{valorM-1_0, valorM-1_1, ..., valorM-1_N-1}
};
matriz[indice1][indice2] = valor;
int matriz[50][20];
/* 50 filas x 20 columnas */
int matriz[2][3] = {
{ 2, 5, 8 },
{ 9, 1, 2 }
};
matriz[1][0] = 50;
int i, j;
for (i=0; i < 100; i++)
for (j=0; j < 50; j++)
printf("%d\n", matriz[i][j]);
int v[2][2][2]={
{{1,2},{3,4}},
{{5,6},{7,8}}
};
for(i=0;i<2;i++)
for(j=0;j<2;j++)
for(k=0;k<2;k++)
printf("%d",v[i][j][k]);
Nota: El stdin es el teclado, y el stdout es la pantalla.
#include <stdio.h>
#include <string.h>
int main(void) {
char *string = "Curso Informatica 1";
printf("%d\n", strlen(string));
return 0;
}
size_t: Es un tipo que permite representar el tamaño de cualquier objeto en bytes.
Es el tipo de dato que retorna el operador sizeof y es muy usado
por la librería estándar para representar tamaños y cuentas.
#include <stdio.h>
#include <string.h>
int main(void) {
char string[10];
char *str1 = "abcdefghi";
strcpy(string, str1);
printf("%s\n", string);
return 0;
}
Nota: Esta función siempre asume que en destino hay suficiente lugar para copiar todos los elementos de origen. Si este no fuera el caso el programa fallará!
Bajarse ejemplo extendido que muestra el error de no usar strcpy().
#include <string.h>
#include <stdio.h>
int main(void) {
char destination[25];
char *espacio = " ", *s1 = "Curso", *s2 = "Info 1";
strcpy(destination, s1);
strcat(destination, espacio);
strcat(destination, s2);
printf("%s\n", destination);
return 0;
}
Nota: Esta función siempre asume que en string1 hay suficiente lugar para copiar todos los elementos de string2. Si este no fuera el caso el programa fallará!
Podemos usar : strncpy() y strncat()
char *strncpy(char *dest, const char *src, size_t n);
char *strncat(char *dest, const char *src, size_t n);
#include <string.h>
#include <stdio.h>
void main(void) {
char *buf1 = "aaa", *buf2 = "bbb", *buf3 = "ccc";
int ptr;
ptr = strcmp(buf2, buf1);
if (ptr > 0)
printf("buffer 2 es mayor que buffer 1\n");
else
printf("buffer 2 es menor que buffer 1\n");
ptr = strcmp(buf2, buf3);
if (ptr > 0)
printf("buffer 2 es mayor que buffer 3\n");
else
printf("buffer 2 es menor que buffer 3\n");
}
Bajarse ejemplo extendido que incluye una comparación buscando si son iguales.
Instalando y copilando:
$ sudo apt-get install libncurses5-dev
$ gcc -o ncurses ncurses1_helloworld.c -lncurses
Usando curses.h:
sudo apt-get install libncurses-dev
gcc -lcurses -o ej1 mi_ejercicio.c
Ejemplo de código unicode.
srand() & rand()
Fuentes de entriopia físicas:
Lavalamps or pendulums, Weak Radioactive source & Hardware.
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main() {
int num_rolls, i;
printf("Enter the number of dice rolls: ");
scanf("%d", &num_rolls);
// Seed the random number generator with the current time
srand(time(NULL));
// Generate the specified number of random dice rolls
for (i = 0; i < num_rolls; i++) {
int roll = (rand() % 6) + 1; // Generates a random number between 1 and 6
printf("Roll %d: %d\n", i+1, roll);
}
return 0;
}
int substring(char st_salida[], char st_entrada[], int pos, int n)
char *pregunta(char texto[], char opc1[], char opc2[])
Ejemplo de uso de la función strtok