Lenguaje C (matriz y puntero)

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]

Supongo que te gusta

Origin www.cnblogs.com/TianLiang-2000/p/12713005.html
Recomendado
Clasificación