Puntatori in c

Puntatori in c

Il puntatore è un concetto molto importante nella lingua C perché il puntatore ci dà il concetto di indirizzo in memoria. Tutto ciò che non è accessibile dagli altri, il puntatore può accedervi molto facilmente con l'aiuto di indirizzo.

Qui discuteremo del concetto di base di puntatore.

Obbiettivo:

L'obiettivo principale del puntatore è principalmente:

  1. Concetto esteso di puntatore
  2. L'aritmetica del puntatore

Concetto esteso di puntatore:

X P Q R
1000 2000 3000 4000

Esempio:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#includere
Void main ()

Int x = 5, *p, ** q, *** r;
p = & x;
Q = & p;
r = & q;
** Q = 7;
*** r = 7;

Spiegazione:

Qui P è un puntatore. Dalla riga P = & X, capisce che P è un puntatore che tiene l'indirizzo di x .

** Q è anche un tipo di puntatore il cui livello di indirezione è 2 e r è anche un puntatore il cui livello di indirezione è 3. Quanti * ci sono che è il livello di quel puntatore?

La regola è che il livello di puntatore è tale da contenere l'indirizzo di un'altra variabile il cui livello di indirezione è esattamente una meno di quel puntatore.

Per questo Q detiene l'indirizzo di P. P detiene l'indirizzo di x.

La procedura di leggi la riga int x = 5,*p, ** q, *** r;

X è un int. P è un puntatore a un int. Q è un puntatore ad apointer a un int. Quanti sono lì? Diciamo esattamente lo stesso no di punta di parole. Proprio come ** r, significa che r è un puntatore, a un puntatore, a un puntatore a un int.

Se mettiamo un certo valore con l'aiuto di Q scriviamo

1
*q = p, *r = q, *p = x;

Se scriviamo un puntatore o * prima di una variabile di punta.

puntatori aritmetici:

Non possiamo aggiungere moltiplicare o dividere in due indirizzi (è possibile la sottrazione).

Non possiamo moltiplicare un numero intero a un indirizzo. Allo stesso modo, non possiamo dividere un indirizzo con un valore intero.

Esempio di programmazione 1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#includere
void main ()

int a, b;
int *p, *q;
p = & a;
Q = & B;
printf (" %d", p + q);
printf (" %d", p * q);
printf (" %d", p / q);

Produzione:

Spiegazione:

Nel programma sopra menzionato, stiamo cercando di aggiungere, moltiplicare e dividere i due indirizzi scrivendo alcune dichiarazioni.

1
2
3
4
5
printf (" %d", p + q);
printf (" %d", p * q);
printf (" %d", p / q);

Ma non è possibile come puoi vedere dall'output. Il puntatore non dà mai il permesso di aggiungere, moltiplicare e dividere un indirizzo.

Il puntatore può consentire un calcolo matematico. Sono menzionati di seguito:

1
2
3
4
5
6
7
P = 1000
P + 1 = 1002
P + 4 = 1008
P - 1 = 998

P è un puntatore di tipo intero 1000 che si basa sull'indirizzo di a. La variabile "A" ha due byte. L'indirizzo del 1 ° byte è 1001 e l'indirizzo del 2 ° byte è 1002. Se aggiungiamo 1 a un puntatore, fa l'indirizzo del blocco successivo o della variabile successiva anziché l'indirizzo del byte successivo.

1
2
3
4
5
Puntatore + n = puntatore + dimensione di (tipo di puntatore) * n
= 1000 + 2 * 1
= 1002

Possiamo sottrarre due indirizzi dello stesso tipo. Il puntatore lo consente.

Esempio di programmazione 2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#includere
void main ()

int a, b;
int *p, *q;
p = & a;
Q = & B;
printf (" %d", p - q);

Produzione:

Spiegazione:

Qui, stiamo cercando di sottrarre due indirizzi. Fortunatamente, può supportare il puntatore. Non è letteralmente sottratto. È costituito da un blocco a seconda del tipo di dati.

Formula

1
Puntatore 1 - Pointer 2 = (sottrazione letterale) / dimensione di (tipo di puntatore)

Se è tipo char, diviso per 4.

Se è tipo galleggiante, diviso per 4.

Se è il tipo int, diviso per 2.

Esempio di programmazione 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
#includere
void swap (int *, int *);
int main ()

int a, b;
printf ("immettere due numeri");
scanf ("%d%d", & a, & b);
Swap (& A, & B);
printf ("a = %d b B = %d", a, b);

vuoto scambio (int *x, int *y)

int t;
t = *x;
*x = *y;
*y = t;

Produzione:

Spiegazione:

Qui, un puntatore può passare attraverso una funzione. Questo è chiamato Call by References. Se vogliamo scambiare due numeri interi passando i valori di due numeri interi attraverso una funzione, non è possibile.

Dobbiamo passare l'indirizzo della variabile t = & x. Se aggiungiamo * a una variabile puntatore, allora * X si è trasformato in tale variabile che contiene il valore della variabile, che punta la variabile P. Significa t = *x, mezzi, t ha il valore di un indirettamente.

Chiama per riferimenti:

Call by References è uguale alla chiamata per indirizzo. Quando gli argomenti formali sono variabili di puntatore, è chiamata per riferimenti.

Riferimento significa indirizzo. Chiamata per riferimento mezzi, quando chiamiamo una funzione, passiamo gli indirizzi delle variabili, si chiama Call of Reference.

Una domanda importante può sorgere relative all'indirizzo o al motivo per cui utilizziamo l'indirizzo di (&) in scanf ()?

Scanf () è una funzione predefinita nella lingua C. main () è anche una funzione nella lingua C. Usiamo scanf () all'interno di main (). Quindi, se dichiariamo due variabili all'interno della funzione principale (), accediamo a questa variabile in scanf (). Non possiamo usare le variabili di una funzione per un'altra funzione. Quindi, la funzione scanf () vuole dare un certo valore a una variabile e b variabile, quindi deve conoscere l'indirizzo di A e B.

Per questo indirizzo di (&) viene utilizzato in scanf ().

Conclusione:

Possiamo conoscere tutto il concetto di base di puntatore. Da questa discussione siamo giunti a questa conclusione che senza puntatore non possiamo visualizzare la gestione della memoria in linguaggio C. Indirizzo controlla l'intero schema di gestione della memoria. Per questo dobbiamo conoscere il concetto di puntatore.