Los arrays se pasan siempre por referencia, si retornaras (char*)&cad seria exactamente la misma direccion la que estuvieras devolviendo.
Eso te imprime 77, el puntero es correcto, pero el valor en la pila es modificado posteriormente.
Que es el (char*)? porque hace falta ponerlo?
Pues no entiendo la diferencia entre retornar "cad" y retornar "&v", ambas son direcciones de memoria, y ambas son modificadas al retornar la funcion, por lo que tambien tendria que variar el contenido de "&v"... incluso el compilador te marca el mismo aviso que dijiste "warning C4172: returning address of local variable or temporary".
Otra cosa, que estas comparando en esta sentencia? : "if(cad1<cad2)"... ya se que para comparar se utiliza strcmp...
Es un casting, hace falta ya que tu variable es char[5] y no char *.
No hay diferencia, las dos estan mal, vos dijiste que funcionaba y yo te mostre que en ese caso durante un momento funcionaba y ni bien hacias una operacion el valor, que esta en la pila, era modificado. El contenido de v varia, por algo imprime 77 y no 3, v sigue apuntando a la misma direccion en memoria pero su contenido cambia.
Porque tiene que ser "char*"? no estabamos devolviendo antes cad? que deberia ser lo mismo que &cad?
Pero cambia, porque invocaste a la funcion primero con 3 y luego con 77, entonces logicamente, la direccion de memoria de v contendra el ultimo valor que le diste, en este caso 77, y te imprime de hecho 77. Pero en el caso que yo puse arriba, invoque a la funcion solo con un valor, solo una vez, y sin embargo, la pila es modificada mientras que con "&v" no.
Ya lo hice, gracias por tu ayuda. A ver, si yo el ejemplo que me pusiste lo entiendo, entiendo lo que quieres decir, el puntero modifica su valor apuntado cada vez que algo llama a la funcion...