Enlace: https: //zhuanlan.zhihu.com/p/23726515
Fuente: saber casi con
derechos de autor del autor. Para reimpresiones comerciales, comuníquese con el autor para obtener autorización. Para reimpresiones no comerciales, indique la fuente.
declaración:
-
El contenido del artículo se recopila y compila de "C ++ Primer Chinese Edition (5th Edition)", y los derechos de autor pertenecen al libro original.
-
El libro original tiene interpretaciones más detalladas y maravillosas, compre libros genuinos para aprender.
-
Este artículo es solo para aprendizaje y comunicación, cualquier forma de reimpresión está prohibida.
El mecanismo de inicialización de parámetros formales es el mismo que el de inicialización de variables.
Pasar por valor y pasar por referencia
-
Si el parámetro formal es un tipo de referencia, estará vinculado al parámetro real correspondiente
-
De lo contrario, copie el valor del parámetro real y asígnelo al parámetro formal
El puntero también sigue las reglas anteriores. Al llamar a la función, el valor del parámetro del puntero se copia y se asigna al parámetro del puntero. Son dos punteros, pero apuntan al mismo objeto.
Pasar por referencia puede evitar la copia de objetos, por lo que se recomienda utilizar pasar por referencia tanto como sea posible
Si no necesita cambiar el valor del parámetro de referencia, es mejor usar una referencia constante, que puede aceptar más tipos de argumentos que las referencias ordinarias.
-
Las referencias ordinarias solo aceptan objetos del mismo tipo que los valores iniciales
-
Las referencias constantes se pueden inicializar con objetos del mismo tipo, expresiones y literales
Si la función requiere varios valores de retorno, puede utilizar parámetros de referencia para devolver información adicional.
parámetros const y parámetros reales
void fcn( const int i);
void fcn( int i );
No constituye una sobrecarga de funciones, porque al igual que otros procedimientos de inicialización, se ignora la constante de nivel superior de los parámetros formales. En otras palabras, el parámetro real puede ser constante o no constante.
Parámetro de matriz
Las matrices tienen dos propiedades especiales
-
No admite copia
-
Los nombres de las matrices generalmente se convierten automáticamente en punteros
También hace que los parámetros de la matriz sean especiales
void print( const int* );
void print( const int[] );
void print( const int[10] );
Subjetivamente, pensaríamos que estas tres son definiciones diferentes, pero las dos últimas también se convertirán automáticamente a const int * para su procesamiento.
En la llamada, el parámetro real puede ser un nombre de matriz o un puntero entero
Debido a que los parámetros formales son solo punteros enteros, las dimensiones de la matriz no se pasan a la función. Hay tres formas de resolver este problema.
-
Pase el puntero del primer elemento y el último elemento
-
Agregue un parámetro para pasar el tamaño de la matriz
-
Usar parámetros de referencia de matriz
Parámetro de referencia de matriz
void print(int (&arr)[10] );
Sin embargo, esta definición también nos limita a solo pasar matrices de dimensión 10.
Matrices multidimensionales
Como se mencionó anteriormente, una matriz multidimensional es en realidad una matriz de matrices, y el primer elemento es un puntero a la matriz.
void print(int matrix[10][10], int rowSize);
¿Por qué pasar rowSize?
Sabemos que las matrices se convierten automáticamente en punteros, y esta no es una excepción. La esencia de la definición anterior es
void print(int (*matrix)[10], int rowSize);
Por lo tanto, rowSize es necesario para especificar la primera dimensión de la matriz bidimensional.
Los parámetros formales de la función principal
La función principal es el mejor ejemplo de familiaridad con los parámetros de la matriz.
int main(int argc, char *argv[]) {}
El segundo parámetro se declara como una matriz de char *, lo que significa que podemos pasar varias cadenas, y el número específico lo especifica argc
También se puede definir como
int main( int argc, char **argv ) {}