Supongo que tienes algún tipo de datos para representar cada carta (vamos, dos enteros indicando el palo y el número o algo así). Los metes todos seguidos en un array, y con un generador de números aleatorios, eliges dos índices del array, y los intercambias. Vuelves a elegir dos números, y los intercambias... y así mucho rato, hasta que el orden original no se parece en nada.
Otra forma: tienes las cartas en un array, tienes otro array que rellenaras con las cartas en desorden, y otro array de valores booleanos. En un bucle vas eligiendo una carta de las cartas originales. Si esa carta ya está en el array final, eliges otra, hasta que encuentres una que no esté en el array, y la añades, así hasta que hayas cogido todas. Para saber si la carta ya la tenias, consultas el de booleanos. Mäs o menos:
Carta cartasOrdenadas[40];
Carta cartasBarajadas[40];
void barajar() {
bool cartaUsada[40];
// Inicializo el array cartaUsada todo a false
...
// Empiezo
for (int i = 0; i < 40; i++) {
int aleatorio = eligeNumeroEntre1y40();
while (cartaUsada[aleatorio - 1])
aleatorio = eligeNumeroEntre1y40();
cartasBarajadas[i] = cartasOrdenadas[i];
cartaUsada[i] = true;
}
}
Espero que te sirva... y no haberme confundido :)