Linguagem C (matriz e ponteiro)

Matriz

  char a [n]; quando n é um número inteiro ou expressão inteira, não é um array de comprimento variável; caso contrário, o array é de comprimento variável; (c99) os
  arrays de caracteres podem ser impressos de uma vez no formato de string.

// Método de atribuição: 
char a [] = " abcde " ;
 int a [ 10 ] = { 1 , 2 , 3 }; // Os sem atribuição são todos 0; 
int a [] = { 1 , 2 , 3 , 4 , 5 }; // Calcula automaticamente o comprimento 
int a [ 10 ] = {[ 3 ] = 3 , [ 5 ] = 5 , [ 8 ] = 8 }; // Especifique a atribuição
 // Matriz 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 }; // Você não pode escrever o número de linhas, mas o número de colunas deve ser gravado

Ponteiro

  Variáveis ​​armazenam dados, ponteiros armazenam endereços;

  A memória ocupada pelo ponteiro é de 4 bytes , diferentemente das variáveis ​​( int (4), char (1), float (4), double (8)); [Endereço: & a; Valor: * a;]

int a = 1 ; int * b = & a ;
 // Se a atribuição não for um endereço, o ponteiro aponta para o local especificado representado pelos dados inteiros
 // O espaço reservado para o endereço é% p

Nome numérico

  É uma informação de endereço (o nome da matriz é uma constante de ponteiro ) e também é o endereço do primeiro elemento da matriz; portanto, [matriz / ponteiro] também pode acessar os elementos usando [ponteiro / matriz].

  As matrizes podem acessar apenas cada elemento separadamente (cada elemento é um valor l) , não uma matriz inteira ; (os nomes das funções têm propriedades semelhantes)

// A diferença entre o ponteiro e o nome do array: o ponteiro é um lvalue (variável, usado para armazenar o endereço), e o nome do array é uma constante de endereço (rvalue); 
int a, b, c = 0 ;
 int * p [ 3 ] = { " asdf " , " qwer " , " czxnh " }; // Matriz de ponteiro: uma matriz que armazena apenas ponteiros; 
int (* p) [ 3 ]; // Ponteiro de matriz: ponteiro para a matriz (a unidade de movimento do ponteiro) É o tamanho da matriz)
 // Ao atribuir um valor, atribua a ele o endereço da matriz: int (* p) [3] = & nome da matriz unidimensional

Ponteiros de matriz e matrizes bidimensionais

  Matriz bidimensional

  Cada elemento é uma matriz unidimensional; portanto, o nome da matriz bidimensional é o endereço da primeira matriz de um bit;

int array [ 4 ] [ 5 ]; array == array [ 0 ];
 * (array + 1 ) == array [ 1 ] == & array [ 1 ] [ 0 ];
 // Todos são endereços, adicione um * na frente O valor neste local pode ser recuperado
 // ou seja: * (* (p + i) + j) == p [i] [j];

  Ponteiro de matriz

  int (* p) [5] = matriz;

  Ponteiro para matriz

  A unidade de movimento do ponteiro da matriz é o tamanho da matriz : * (* (p + i) + j) == p [i] [j];


ponteiro void (sem tipo) e ponteiro NULL (kong)
   void* p:ponteiro sem tipo, quepode apontar para qualquer tipo de dado; a conversão forçada de tipo é necessária quando a dereferenciação;* (int*) p;
  ponteiro NULL: não aponta para nenhum dado: [De fato, NULL é uma definição de macro: 0; #define NULL ((void*) 0) 0 endereço geralmente não é apontado]);
    quando o ponteiro é definido e o endereço não é conhecido, você pode apontar para NULL [int* p = NULL; 】


Ponteiro secundário

  Armazene o endereço do ponteiro; [A desreferência de um nível é apenas o endereço de um ponteiro ] Como o ponteiro de
  segundo nível aponta para o ponteiro, a unidade do movimento do ponteiro de segundo nível é o tamanho do ponteiro (4 bytes)

int ** p1, (* p2) [ 4 ]; // p1 é um ponteiro secundário, p2 é um ponteiro de matriz; 
* (p1 + 1 ) - * p1 = 4 ; // Como o ponteiro secundário aponta para um ponteiro int, o intervalo 4 
* (p2 + 1 ) - * p2 = 16 ; // Como esse ponteiro da matriz aponta para uma matriz int de comprimento 4, a extensão é 16

Nota: Como mencionado acima, quando um ponteiro de matriz aponta para uma matriz, existe * (* (p2 + i) + j) == matriz [i] [j]; o ponteiro de segundo nível não possui essa propriedade.


Constantes e ponteiros

  1. Definição de macro: defina A 'a'
  2. Use a  palavra-chave const  (somente leitura, não gravação): const float pai = 3.14;

Ponteiro para constante

const  int * p;
 // Ponteiro para constante, ponto para constante. O valor apontado pelo endereço não pode ser modificado por desreferência; o valor desreferenciado pode ser modificado indiretamente, modificando para uma constante diferente 
int * const p;
 // Aponte para um ponteiro constante, aponte para uma variável. Não é possível alterar o valor do endereço apontado pela desreferenciação; você pode modificar o valor da variável para modificar indiretamente o valor desreferenciado 
const  int * const p;
 // Um ponteiro constante para uma constante; [Um ponteiro para uma constante também pode apontar para uma variável]

Acho que você gosta

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