O ponteiro é um conceito muito importante na linguagem C, porque o ponteiro nos dá o conceito de endereço na memória. Tudo o que não é acessível pelos outros, o ponteiro pode acessar isso com muita facilidade com a ajuda do endereço.
Aqui vamos discutir o conceito básico de ponteiro.
Objetivo:
O principal objetivo do ponteiro é principalmente:
Conceito estendido de ponteiro:
X | p | q | r |
---|---|---|---|
1000 | 2000 | 3000 | 4000 |
Exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #incluir Void main () Int x = 5, *p, ** q, *** r; p = & x; Q = & P; r = & q; ** Q = 7; *** r = 7; |
Explicação:
Aqui P é um ponteiro. Da linha P = & x, entende que P é um ponteiro que segura o endereço de x .
** q também é um tipo de ponteiro cujo nível de indireção é 2 e R também é um ponteiro cujo nível de indireção é 3. Quantos * existem que são o nível desse ponteiro?
A regra é que o nível de ponteiro é tal que mantém o endereço de outra variável cujo nível de indireção é exatamente um menos desse ponteiro.
Para este q, mantém o endereço de P. P mantém o endereço de x.
O procedimento de leitura da linha int x = 5,*p, ** q, *** r;
x é um int. P é um ponteiro para um int. q é um ponteiro para o patrocínio para um int. Quantos ** existem? Dizemos exatamente o mesmo não de ponteiro de palavras. Assim como ** r, significa r um ponteiro, para um ponteiro, para um ponteiro para um int.
Se colocarmos algum valor com a ajuda de q, escrevemos
1 | *q = p, *r = q, *p = x; |
Se escrevermos um ponteiro ou * antes de uma variável de ponteiro, ela se transformará em uma variável que aponta para a média variável, P Block.
Ponteiros aritméticos:
Não podemos adicionar multiplicar ou dividir em dois endereços (a subtração é possível).
Não podemos multiplicar um número inteiro por um endereço. Da mesma forma, não podemos dividir um endereço com um valor inteiro.
Exemplo de programação 1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #incluir void main () int a, b; int *p, *q; p = & a; Q = & b; printf (" %d", p + q); printf (" %d", p * q); printf (" %d", p / q); |
Saída:
Explicação:
No programa acima mencionado, estamos tentando adicionar, multiplicar e dividir os dois endereços escrevendo algumas declarações.
1 2 3 4 5 | printf (" %d", p + q); printf (" %d", p * q); printf (" %d", p / q); |
Mas não é possível como você pode ver na saída. O ponteiro nunca dá permissão para adicionar, multiplicar e dividir algum endereço.
O ponteiro pode permitir algum cálculo matemático. Eles são mencionados abaixo:
1 2 3 4 5 6 7 | P = 1000 P + 1 = 1002 P + 4 = 1008 P - 1 = 998 |
P é o ponteiro do tipo inteiro 1000 que é baseado no endereço de um. A variável “A” tem dois bytes. O endereço do 1º byte é 1001 e o endereço do 2º byte é 1002. Se adicionarmos 1 a um ponteiro, ele fará o endereço do próximo bloco ou a próxima variável em vez do endereço do próximo byte.
1 2 3 4 5 | Ponteiro + n = ponteiro + tamanho de (tipo de ponteiro) * n = 1000 + 2 * 1 = 1002 |
Podemos subtrair dois endereços do mesmo tipo. O ponteiro permite.
Exemplo de programação 2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #incluir void main () int a, b; int *p, *q; p = & a; Q = & b; printf (" %d", p - q); |
Saída:
Explicação:
Aqui, estamos tentando subtrair dois endereços. Felizmente, pode apoiar o ponteiro. Não é literalmente subtraído. É composto por um bloco, dependendo do seu tipo de dados.
Fórmula
1 | Ponteiro 1 - ponteiro 2 = (subtração literal) / tamanho de (tipo de ponteiro) |
Se for o tipo de char, dividido por 4.
Se for o tipo de flutuação, dividido por 4.
Se for o tipo int, dividido por 2.
Exemplo de programação 3:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #incluir swap void (int *, int *); int main () int a, b; printf ("Digite dois número"); scanf ("%d%d", & a, & b); troca (& a, & b); printf ("a = %d b = %d", a, b); Void Swap (int *x, int *y) int t; t = *x; *x = *y; *y = t; |
Saída:
Explicação:
Aqui, um ponteiro pode passar por uma função. Isso é chamado de chamada por referências. Se queremos trocar dois números inteiros passando os valores de dois números inteiros por meio de uma função, não é possível.
Devemos passar no endereço da variável t = & x. Se adicionarmos * a uma variável de ponteiro, então * X se transformou em uma variável que mantém o valor da variável, que aponta a variável P. Significa t = *x, significa t mantém o valor de um indiretamente.
Ligue por referências:
A chamada por referências é a mesma que a chamada por endereço. Quando argumentos formais são variáveis de ponteiro, é chamado por referências.
Referência significa endereço. Chamada por meios de referência, quando chamamos uma função, passamos os endereços das variáveis, é chamado Call of Reference.
Uma questão importante pode surgir relacionada ao endereço ou por que usamos o endereço de (&) em scanf ()?
Scanf () é uma função predefinida na linguagem C. Main () também é uma função na linguagem C. Usamos scanf () dentro de main (). Portanto, se declararmos duas variáveis dentro da função main (), acessamos essa variável no scanf (). Não podemos usar variáveis de uma função para outra função. Portanto, a função scanf () deseja colocar algum valor a uma variável e b variável, então deve saber o endereço de A e B.
Para este endereço de (&) é usado em scanf ().
Conclusão:
Podemos saber todo o conceito básico de ponteiro. A partir desta discussão, chegamos a essa conclusão de que, sem ponteiro, não podemos visualizar o gerenciamento de memória na linguagem C. O endereço controla todo o esquema de gerenciamento de memória. Para isso, devemos conhecer o conceito de ponteiro.