Matriz
char a [n]; cuando n es un entero o una expresión de entero, no es una matriz de longitud variable, de lo contrario la matriz es de longitud variable; (c99) las
matrices de caracteres se pueden imprimir de una vez en formato de cadena.
// Método de asignación: char a [] = " abcde " ; int a [ 10 ] = { 1 , 2 , 3 }; // Los que no tienen asignación son todos 0; int a [] = { 1 , 2 , 3 , 4 , 5 }; // Calcular automáticamente la longitud int a [ 10 ] = {[ 3 ] = 3 , [ 5 ] = 5 , [ 8 ] = 8 }; // Especifique la asignación // Conjunto bidimensional: inta [ 2 ] [ 3 ] = { 1 , 2 , 3 , 4 }; int a [ 2 ] [ 3 ] = {{ 1 , 2 }, { 3 }}; int a [ 2 ] [ 3 ] = {[ 0 ] [ 1 ] = 1 , [ 0 ] [ 2 ] = 2 , [ 1 ] [ 0 ] = 3 }; int a [] [ 3 ] = { 1 , 2 , 3, 4 , 5 , 6 , 7 }; // No puede escribir el número de filas, pero debe escribirse el número de columnas
Puntero
Las variables almacenan datos, los punteros almacenan direcciones;
La memoria ocupada por el puntero es de 4 bytes , a diferencia de las variables ( int (4), char (1), float (4), double (8)); [Dirección: & a; Valor: * a;]
int a = 1 ; int * b = & a ; // Si la asignación no es una dirección, el puntero apunta a la ubicación especificada representada por los datos enteros // El marcador de posición para la dirección es% p
Nombre numérico
Es una información de dirección (el nombre de la matriz es una constante de puntero ), y también es la dirección del primer elemento de la matriz, por lo que [matriz / puntero] también puede acceder a los elementos utilizando [puntero / matriz].
Las matrices solo pueden acceder a cada elemento por separado (cada elemento es un valor l) , no a una matriz completa ; (los nombres de las funciones tienen propiedades similares)
// La diferencia entre el puntero y el nombre de la matriz: el puntero es un lvalue (variable, usado para almacenar la dirección), y el nombre de la matriz es una constante de dirección (rvalue); int a, b, c = 0 ; int * p [ 3 ] = { " asdf " , " qwer " , " czxnh " }; // Matriz de punteros: una matriz que almacena solo punteros; int (* p) [ 3 ]; // Puntero de matriz: puntero a la matriz (la unidad de movimiento del puntero) Es el tamaño de la matriz) // Al asignar un valor, asígnele la dirección de la matriz: int (* p) [3] = & nombre de matriz unidimensional
Punteros de matriz y matrices bidimensionales
Matriz bidimensional
Cada elemento es una matriz unidimensional, por lo que el nombre de la matriz bidimensional es la dirección de la primera matriz de un bit;
int array [ 4 ] [ 5 ]; array == array [ 0 ]; * (array + 1 ) == array [ 1 ] == & array [ 1 ] [ 0 ]; // Todas son direcciones, agregue un * al frente El valor en esta ubicación se puede recuperar // es decir: * (* (p + i) + j) == p [i] [j];
Puntero de matriz
int (* p) [5] = matriz;
Puntero a la matriz
La unidad de movimiento del puntero de la matriz es el tamaño de la matriz : * (* (p + i) + j) == p [i] [j];
void (sin tipo) puntero y puntero NULL (kong)
void* p:puntero sin tipo, quepuede apuntar a cualquier tipo de datos; se requiere conversión de tipo forzado al desreferenciar;* (int*) p;
puntero NULL: no apunta a ningún dato: [De hecho, NULL es una definición de macro: 0; #define NULL ((void*) 0) 0 la dirección generalmente no apunta);
cuando se define el puntero y no se conoce la dirección, puede apuntar a NULL [int* p = NULL; 】
Puntero secundario
Almacene la dirección del puntero; [la desreferencia de un nivel es solo la dirección de un puntero ] Como el puntero de
segundo nivel apunta al puntero, la unidad del movimiento del puntero de segundo nivel es el tamaño del puntero (4 bytes)
int ** p1, (* p2) [ 4 ]; // p1 es el puntero de segundo nivel, p2 es el puntero de matriz; * (p1 + 1 ) - * p1 = 4 ; // Debido a que el puntero de segundo nivel apunta al puntero int, el intervalo es 4 * (p2 + 1 ) - * p2 = 16 ; // Debido a que este puntero de matriz apunta a una matriz int de longitud 4, el intervalo es 16
Nota: Como se mencionó anteriormente, cuando un puntero de matriz apunta a una matriz, hay * (* (p2 + i) + j) == matriz [i] [j]; el puntero de segundo nivel no tiene esta propiedad.
Constantes y punteros
1. Definición de macro: defina A 'a'
2. Use la palabra clave const (solo lectura, no escritura): const float pai = 3.14;
Puntero a constante
const int * p; // Puntero a constante, punto a constante. El valor al que apunta la dirección no se puede modificar por desreferencia; el valor desreferenciado se puede modificar indirectamente modificando a una constante diferente int * const p; // Apunte a un puntero constante, apunte a una variable. No se puede cambiar el valor de la dirección señalada al desreferenciar; puede modificar el valor de la variable para modificar indirectamente el valor desreferenciado const int * const p; // Un puntero constante a una constante; [Un puntero a una constante también puede apuntar a una variable]