pointers pointer operations c
Un estudi intensiu dels indicadors i els seus usos en C ++.
Un punter és una de les funcions més potents del llenguatge C ++. Un punter ajuda a manipular les variables a través de la seva adreça.
com obrir fitxers .java
En aquest tutorial, explorarem tot sobre els indicadors i els seus usos en C ++ en detall.
=> Mireu aquí la sèrie d'entrenament C ++ simple.
Què aprendreu:
- Què és un punter?
- Aritmètica del punter
- Punteries nul·les i buides
- Matrius i indicadors
- Matriu d’indicadors
- Punter de punteres
- Passar els indicadors a les funcions
- Punters de funció
- Conclusió
- Lectura recomanada
Què és un punter?
Un punter és una variable que conté l'adreça d'una ubicació de memòria. Sabem que totes les variables que declarem tenen una adreça específica a la memòria. Declarem una variable punter que assenyali aquestes adreces a la memòria.
La sintaxi general per declarar una variable de punter és:
datatype * variable_name;
Per exemple, la declaració int * ptr;
Això significa que ptr és un punter que apunta a una variable de tipus int. Per tant, una variable punter sempre conté una ubicació o adreça de memòria. Vegem a continuació el funcionament de les variables de punter.
Penseu que tenim les declaracions següents:
Int p, *ptr; //declare variable p and pointer variable ptr p = 4; //assign value 4 to variable p ptr = &p; //assign address of p to pointer variable ptr
A la memòria, aquestes declaracions es representaran de la següent manera:
Aquesta és la representació interna del punter a la memòria. Quan assignem la variable d’adreça a la variable punter, assenyala la variable tal com es mostra a la representació anterior.
Com que ptr té una adreça de variable p, * ptr donarà el valor de la variable p (variable que apunta la variable de punter ptr).
Nota: L'operador * que fem servir amb el punter s'utilitza per indicar que és una variable punter.
Vegem alguns dels conceptes de punter que s’utilitzen a C ++.
Aritmètica del punter
Sabem que una variable punter sempre apunta a l'adreça de la memòria. Entre les operacions que podem realitzar, tenim les següents operacions aritmètiques que es duen a terme en punteres.
- Operador d'increment (++)
- Operador de disminució (-)
- Addició (+)
- Resta (-)
Vegem l’ús d’aquestes operacions en un programa d’exemple.
#include #include using namespace std; int main() { int myarray(5) = {2, 4,6, 8,10}; int* myptr; myptr = myarray; cout<<'First element in the array :'<<*myptr< Sortida:
Primer element de la matriu: 2
següent element de la matriu: 4
següent element de la matriu: 6
següent element de la matriu: 4
següent element de la matriu: 2
Hem vist les operacions aritmètiques realitzades en punteres. Tingueu en compte que l’operador d’increment ++ incrementa el punter i apunta al següent element de la matriu. De la mateixa manera, l'operador de decrement disminueix la variable de punter en 1 de manera que apunti a l'element anterior de la matriu.
També fem servir operadors + i -. En primer lloc, hem afegit 1 a la variable punter. El resultat mostra que apunta al següent element de la matriu. De la mateixa manera, l'operador - fa que el punter sigui variable per apuntar a l'element anterior de la matriu.
A part d’aquests operadors aritmètics, també podem utilitzar operadors de comparació com ==,.
Punteries nul·les i buides
Si en el cas, a una variable de punter no se li assigna una adreça d'una variable, és una bona pràctica assignar un valor NULL a la variable de punter. La variable de punter amb un valor NULL s’anomena punter NULL.
Un punter nul és un punter constant amb el valor zero definit a la capçalera iostream. El sistema operatiu reserva la memòria a l’adreça 0 i no podem accedir a aquesta ubicació.
Mitjançant el punter nul, podem evitar el mal ús de punteres no utilitzats i evitar que les variables de punter tinguin assignats alguns valors d’escombraries.
Els indicadors buits són els indicadors especials que apunten als valors sense tipus. Els indicadors de buit són més flexibles ja que poden apuntar a qualsevol tipus. Però no es poden desferenciar directament. Per a la desferenciació, cal convertir el punter buit en un punter que apunti a un valor amb el tipus de dades concret.
Hem mostrat el funcionament del punter NULL i del punter void al següent exemple de codi.
#include #include using namespace std; int main() { int intvar = 10; char c = 'A'; void* vptr; int* myptr = NULL; cout<<'NULL pointer value :'< Sortida:
Valor del punter NULL: 0
El punter buit vptr apunta a: A
El punter buit vptr apunta a: 10
En el programa anterior, primer, declarem un punter enter al qual se li assigna un valor NULL. Quan imprimim aquest punter, veiem que el valor és 0, tal com hem comentat anteriorment.
A continuació, declarem un punter buit. En primer lloc, assignem una adreça de variable de caràcter a aquest punter buit. A continuació, assignem el punter buit a un punter de caràcters i el tipografiem amb char *. A continuació, imprimim el valor charptr que assenyala el caràcter A que era una variable de caràcter que vam declarar anteriorment i que apunta el punter buit.
A continuació, hem assignat una variable sencera al punter buit i, a continuació, realitzem els mateixos passos per desferenciar aquest punter buit mitjançant un punter enter.
estructura de dades de gràfics c ++
Matrius i indicadors
Les matrius i els indicadors s’associen fortament entre si. Sabem que el nom de la matriu apunta al primer element de la matriu i que és un punter constant.
Podem assignar aquest punter a una variable de punter i accedir a la matriu decrementant el punter o mitjançant l’operador de subíndex.
Veurem aquesta associació entre la variable punter i la matriu al següent exemple de codi.
#include #include using namespace std; int main() { int myarray(5) = {1, 1, 2, 3, 5}; int* ptrvar; ptrvar = myarray; for(int i=0;i<5;i++) { cout<<*ptrvar<<' '; ptrvar++; } return 0; }
Sortida:
1 1 2 5 mar
Al programa anterior, assignem el nom de la matriu a una variable de punter. A mesura que el nom de la matriu assenyala el primer element de la matriu, podem imprimir el contingut de tota la matriu utilitzant una variable punter i incrementar-la mitjançant l'operador ++. Això es mostra a la sortida.
Matriu d’indicadors
De vegades, necessitem més d'una variable de punter en un programa. En lloc de declarar cada variable de punter individual, podem declarar una matriu de punteres.
Prenguem immediatament un exemple per demostrar una sèrie de punteres.
#include #include using namespace std; int main() { int myarray(5) = {2,4,6,8,10}; int *ptr(5); //array of pointers for(int i=0;i<5;i++){ ptr(i) = &myarray(i); } for (int i = 0; i < 5; i++) { cout << 'Value of myarray(' << i << ') = '; cout << *ptr(i) << endl; } return 0; }
Sortida:
Valor de la matriu (0) = 2
Valor de la matriu (1) = 4
Valor de la matriu (2) = 6
Valor de la matriu (3) = 8
Valor de la matriu (4) = 10
A la declaració anterior,
int * ptr (5);
Podem interpretar com; ptr és una matriu de 5 punters enters. Per tant, cada element de ptr apuntarà a una variable de tipus enter.
Utilitzem una matriu sencera i assignem l'adreça de cada element de la matriu a cadascun dels elements ptr. A continuació, mostrem el contingut de la matriu ptr mitjançant la sortida de '* ptr (i)'.
Punter de punteres
El punter dels indicadors no és res més que múltiples indirectes. És una mena de cadena de punteres. Quan definim un punter de punteres, el primer punter té una adreça del segon punter, que al seu torn té l'adreça de la variable a la qual apunta.
A la memòria, es representarà com:

Un punter de punteres es declara de la següent manera:
int** intptr;
Prenem directament un exemple de codi per entendre millor el punter dels indicadors.
#include #include using namespace std; int main() { int *vptr; int ** intptr; int var = 10; vptr = &var; intptr = &vptr; cout<<'Variable var: '< Sortida:
Variable var: 10
Punter a variable: 10
Punter a Punter a una variable: 10
Al programa anterior, declarem una variable sencera, un punter enter i un punter d'un punter a un enter. Com es mostra al programa, a la variable punter se li assigna el valor d'una variable. Al punter de la variable punter se li assigna l'adreça de la variable punter.
Al final, imprimim les tres variables que mostren el mateix valor 10 igual a una variable sencera.
Passar els indicadors a les funcions
Passar punteres a la funció és el mateix que altres tècniques de pas de paràmetres en què passem variables de punter a la funció.
Tornem a revisar els nostres valors d'intercanvi i el modificem per passar variables de punter com a paràmetres.
#include #include using namespace std; void swap(int* a, int* b) { int temp; temp = *a; *a = *b; *b = temp; } int main() { int a, b; cout<>a>>b; cout<<'a = '< Sortida:
Introduïu els valors a canviar: 3 2
a = 3 b = 2
Valors intercanviats
a = 2 b = 3
Com es mostra al programa, passem els valors a canviar com a variables enteres. Els paràmetres formals es defineixen com a variables de punter. Com a resultat d'això, els canvis realitzats a les variables dins de les funcions també es reflecteixen a la funció de trucada.
Punters de funció
de la mateixa manera, ja que tenim indicadors de variables, matrius, etc., també podem tenir indicadors de funcions. Però la diferència és que el punter de la funció apunta al codi executable i no a dades com ara variables o matrius.
Prenem un exemple per demostrar indicadors de funció.
#include #include using namespace std; void displayVal(int a) { printf('Value of a is %d
', a); } int main() { void (*func_ptr)(int) = &displayVal; (*func_ptr)(100); return 0; }
Sortida:
El valor de a és 100
com imprimir una matriu en ordre invers java
Al programa anterior, tenim una funció ‘displayVal’ que acaba d’imprimir un valor enter que se li ha passat. A la funció principal, hem definit un punter de funció 'func_ptr' que pren un int com a argument i retorna un tipus de buit.
void (* func_ptr) (int)
Nota: Hem d’incloure el punter de funció dins (). Si l’ometem, es convertirà en un prototip de funció.
Hem assignat l’adreça de la funció ‘displayVal’ a aquest punter de funció. A continuació, utilitzant aquest punter de funció ‘func_ptr’ passem el valor de l’argument 100 que equival a cridar displayVal amb l’argument 100.
Ara bé, si tenim una altra funció amb el mateix prototip, podem utilitzar el mateix punter de funció assignant-li l'adreça de la funció. Aquest és l'ús principal dels indicadors de funcions.
Conclusió
Tot es tracta dels indicadors, les seves definicions i usos en C ++.
Al nostre següent tutorial, aprendrem més sobre referències en C ++. Les referències també tenen un ús especial en C ++ i sovint s’utilitzen com a àlies de variables.
=> Feu clic aquí per obtenir la sèrie de formació Absolute C ++.
Lectura recomanada