Ponteiros em c

Ponteiros em c

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:

  1. Conceito estendido de ponteiro
  2. Aritmética do ponteiro

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.