Esto es lo que encontré durante mi período de aprendizaje:
#include<iostream>
using namespace std;
int dis(char a[1])
{
int length = strlen(a);
char c = a[2];
return length;
}
int main()
{
char b[4] = "abc";
int c = dis(b);
cout << c;
return 0;
}
Entonces, en la variable int dis(char a[1])
, [1]
parece no hacer nada y no funciona en
absoluto, porque puedo usar a[2]
. Justo como int a[]
o char *a
. Sé que el nombre de la matriz es un puntero y cómo transmitir una matriz, por lo que mi rompecabezas no se trata de esta parte.
Lo que quiero saber es por qué los compiladores permiten este comportamiento ( int a[1]
). ¿O tiene otros significados que no conozco?
typedef
tipo de matriz. Por lo que la "decadencia de puntero" en los tipos de argumentos no es sólo azúcar sintáctico reemplazar []
con *
, que realmente va a través del sistema de tipos. Esto tiene consecuencias en el mundo real para algunos tipos estándar como los va_list
que se pueden definir con tipo de matriz o sin matriz.
int dis(char (*a)[1])
. A continuación, se pasa un puntero a una matriz: dis(&b)
. Si está dispuesto a usar características de C que no existen en C ++, también puede decir cosas como void foo(int data[static 256])
y int bar(double matrix[*][*])
, pero esa es una lata completamente diferente de gusanos.