codice:
printf("Mi piace molto %s il %c", "studiare","C");
c'è un errorino. La chiamata dovrebbe essere:
codice:
printf("Mi piace molto %s il %c", "studiare",'C');
con gli apici singoli sui char.

A parte questa inezia, la printf è davvero una funzione utilissima, non solo in C ma anche in C++, in sostituzione di ostream, grazie alla sua grande flessibilità.

Allora già che lucasp vi ha descritto la printf aggiungo una considerazione anch'io: la printf prende un numero arbitrario di parametri dopo la stringa di formattazione.

Il prototipo di printf è
int printf(char* ftm, ...);

i tre puntini indicano che può ricevere n parametri a run-time.

Ad esempio scriviamo una funzioncina che prende come argomento una lista di uno o più interi e li stampa in output finchè nella lista dei parametri non trova -1. Per fare ciò è necessario includere uno header file <stdarg.h> che incorpora varie macro per accedere ai parametri senza nome.

ATTENZIONE: il compilatore non controlla i tipi dei parametri '...'.
Può essere più forte come vincolo passare un vero e proprio array, anche se meno flessibile.
codice:
#include <stdarg.h>
#include <stdio.h>

int printint(int first, ...)
{
	int i;
	int count=0;
	va_list list;
	va_start(list,first); //inizializzazione
	i=first;
	while( i != -1 )
    {
      ++count;
	  printf("%d\n", i);	
      i = va_arg( list, int); //argomento successivo di tipo int
    }
    va_end( list );    
	return count;
}

int main()
{
printint(2,4,6,33,67665,1232,-1);
return 0;
}