#include<stdio.h> void printd(char []); int main(void){ char a[100]; a[0]='a';a[1]='b';a[2]='c';a[4]='d'; printd(a); return 0; } void printd(char a[]){ a++; printf("%c",*a); a++; printf("%c",*a); }Explicación: Esperaba que resultara en un error de lvalue. Pero está funcionando sin ningún error y dando bc como salida. ¿Por qué esta matriz incremental "a" no es un error?
Si una matriz se pasa a una función, decae en un puntero al primer elemento de la matriz.
Debido a esto dentro de printd() el puntero a puede incrementarse y disminuirse, para apuntar a diferentes elementos de la matriz a como se define en main() .
Tenga en cuenta que al declarar/definir la lista de parámetros de una función para cualquier tipo T , la expresión T[] es equivalente a T* .
En el caso específico de la pregunta
void printd(char a[]);es lo mismo que
void printd(char * a); El siguiente código muestra un comportamiento equivalente al código del OP, con pa comportándose como a lado printd() :
#include <stdio.h> int main(void) { char a[100]; a[0]='a';a[1]='b';a[2]='c';a[4]='d'; { char * pa = a; pa++; printf("%c", *pa); pa++; printf("%c", *pa); } return 0; `}En lenguaje C, la declaración de matriz en la lista de parámetros de función y la declaración de matriz fuera de la lista de parámetros de función significan cosas completamente diferentes, aunque parezcan similares (o iguales) en la superficie.
Cuando usa la declaración de matriz en la lista de parámetros de funciones (como es el caso con void printd(char a[]) en su código), no está declarando una matriz. La sintaxis de nivel superior [] en la lista de parámetros de función es solo una forma alternativa de declaración de puntero . Esto significa que su parámetro a se declara realmente como char *a . No es una matriz en absoluto, es un puntero ordinario. No hay nada inusual en poder incrementar a , y es por eso que no obtiene ningún "error de valor l".
Mientras tanto, su a en main es una verdadera matriz.
¿Por qué esta matriz incremental "a" no es un error?
En C, las matrices se pasan como un puntero a cualquier función. Por eso no te da error.
Las llamadas de función en main() pasan el nombre de la matriz, a , como argumento porque el nombre de una matriz en una expresión se evalúa como un puntero a la matriz . En otras palabras, la expresión, a , es un puntero a (el primer elemento de) la matriz, a[] . Su tipo es, por lo tanto, char * , y una función llamada usa este puntero (pasado como argumento) para acceder indirectamente a los elementos de la matriz.
Ahora, al recibir la dirección del primer elemento de a , a++ significa adelantar la dirección inicial de la matriz en 1 . Es por eso que el primer printf imprime b , el segundo elemento de la matriz a .