logo

Pekare till en matris | Array Pointer

Förutsättning: Pointers Introduktion

Tänk på följande program:

C






#include> int> main()> {> >int> arr[5] = { 1, 2, 3, 4, 5 };> >int> *ptr = arr;> >printf>(>'%p '>, ptr);> >return> 0;> }>

>

>

I programmet ovan har vi en pekare ptr som pekar på 0thelement i arrayen. På liknande sätt kan vi också deklarera en pekare som kan peka på hela arrayen istället för bara ett element i arrayen. Den här pekaren är användbar när man talar om flerdimensionella arrayer.

Syntax:

data_type  (* var_name ) [size_of_array];>

Här:

    data_type är den typ av data som arrayen innehåller. var_name är namnet på pekarvariabeln. size_of_array är storleken på arrayen som pekaren pekar mot.

Exempel

int (*ptr)[10];>

Här ptr är en pekare som kan peka på en matris med 10 heltal. Eftersom subscript har högre prioritet än indirektion, är det nödvändigt att inkludera indirektionsoperatorn och pekarens namn inom parentes. Här är typen av ptr 'pekare till en matris med 10 heltal.

Obs: Pekaren som pekar på 0:anthelement i arrayen och pekaren som pekar på hela arrayen är helt olika. Följande program visar detta:

C




// C program to understand difference between> // pointer to an integer and pointer to an> // array of integers.> #include> int> main()> {> >// Pointer to an integer> >int> *p;> > >// Pointer to an array of 5 integers> >int> (*ptr)[5];> >int> arr[5];> > >// Points to 0th element of the arr.> >p = arr;> > >// Points to the whole array arr.> >ptr = &arr;> > >printf>(>'p = %p, ptr = %p '>, p, ptr);> > >p++;> >ptr++;> > >printf>(>'p = %p, ptr = %p '>, p, ptr);> > >return> 0;> }>

>

>

Produktion

p = 0x7fff6463e890, ptr = 0x7fff6463e890 p = 0x7fff6463e894, ptr = 0x7fff6463e8a4>

Här, sid är pekaren till 0thelement i arrayen arr , medan ptr är en pekare som pekar på hela arrayen arr .

  • Bastypen av sid är int medan bastyp av ptr är 'en matris med 5 heltal'.
  • Vi vet att pekarens aritmetik utförs i förhållande till basstorleken, så om vi skriver ptr++ så är pekaren ptr kommer att flyttas framåt med 20 byte.

Följande figur visar pekaren p och ptr. Den mörkare pilen anger en pekare till en array.

När vi hänvisar till ett pekuttryck får vi ett värde som pekas på av det pekuttrycket. Pekaren till en array pekar på en array, så om vi hänvisar till den bör vi få arrayen, och namnet på arrayen anger basadressen. Så närhelst en pekare till en array avreferens får vi basadressen till arrayen som den pekar på.

C




// C program to illustrate sizes of> // pointer of array> #include> int> main()> {> >int> arr[] = { 3, 5, 6, 7, 9 };> >int> *p = arr;> >int> (*ptr)[5] = &arr;> > >printf>(>'p = %p, ptr = %p '>, p, ptr);> >printf>(>'*p = %d, *ptr = %p '>, *p, *ptr);> > >printf>(>'sizeof(p) = %lu, sizeof(*p) = %lu '>,> >sizeof>(p),>sizeof>(*p));> >printf>(>'sizeof(ptr) = %lu, sizeof(*ptr) = %lu '>,> >sizeof>(ptr),>sizeof>(*ptr));> >return> 0;> }>

>

>

Produktion

p = 0x7fff55adbff0, ptr = 0x7fff55adbff0 *p = 3, *ptr = 0x7fff55adbff0 sizeof(p) = 8, sizeof(*p) = 4 sizeof(ptr) = 8, sizeof(*ptr) = 20>

Pekare till flerdimensionella arrayer

1. Pekare och tvådimensionella arrayer

I en tvådimensionell array kan vi komma åt varje element genom att använda två nedsänkta, där den första nedsänkta representerar radnumret och den andra nedsänkningen representerar kolumnnumret. Elementen i 2-D-arrayen kan också nås med hjälp av pekarens notation. Anta att arr är en 2D-array, vi kan komma åt vilket element som helst arr[i][j] av arrayen med hjälp av pekaruttrycket *(*(arr + i) + j) . Nu ska vi se hur detta uttryck kan härledas.
Låt oss ta en tvådimensionell array arr[3][4] :

int arr[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} };>

Eftersom minnet i en dator är organiserat linjärt är det inte möjligt att lagra 2D-matrisen i rader och kolumner. Konceptet med rader och kolumner är bara teoretiskt, faktiskt, en 2-D-array lagras i rad-huvudordning, dvs rader placeras bredvid varandra. Följande figur visar hur ovanstående 2D-array kommer att lagras i minnet.

Varje rad kan betraktas som en 1-D array, så en tvådimensionell array kan betraktas som en samling endimensionella arrayer som placeras efter varandra. Med andra ord kan vi säga att 2-D dimensionella arrayer som placeras en efter en. Så här arr är en array med 3 element där varje element är en 1-D array med 4 heltal.
Vi vet att namnet på en array är en konstant pekare som pekar på 0th1-D array och innehåller adress 5000. Sedan arr är en 'pekare till en matris med 4 heltal', enligt pekararitmetiken kommer uttrycket arr + 1 att representera adressen 5016 och uttrycket arr + 2 kommer att representera adress 5032.
Så det kan vi säga arr pekar på 0th1-D array, arr + 1 pekar på 1:anst1-D array och arr + 2 pekar på 2:annd1-D array.

Generellt kan vi skriva:

 arr + i Points to ith element of arr ->Pekar på 1-D-arrayen>
  • Eftersom arr + i pekar på ithelement av arr , vid hänvisning får den ithelement av arr vilket naturligtvis är en 1-D array. Alltså uttrycket *(arr + i) ger oss basadressen för ith1-D array.
  • Vi vet, pekaruttrycket *(arr + i) motsvarar det nedsänkta uttrycket arr[i] . Så *(arr + i) vilket är samma som arr[i] ger oss basadressen för ith1-D array.
  • För att komma åt ett enskilt element i vår 2-D-array bör vi kunna komma åt valfri jthelement av ith1-D array.
  • Eftersom basen typ av *(arr + i) är int och den innehåller adressen 0thelement av ith1-D-array, kan vi få adresserna för efterföljande element i ith1-D array genom att lägga till heltalsvärden till *(arr + i) .
  • Till exempel *(arr + i) + 1 kommer att representera adressen till 1stelement av 1stelement av ith1-D array och *(arr+i)+2 kommer att representera adressen till 2ndelement av ith1-D array.
  • På samma sätt kommer *(arr + i) + j att representera adressen till jthelement av ith1-D array. När vi hänvisar till detta uttryck kan vi få jthelement i ith1-D array.

Pekare och tredimensionella arrayer

int arr[2][3][2] = { {{5, 10}, {6, 11}, {7, 12}}, {{20, 30}, {21, 31}, {22, 32}} };>

I en tredimensionell array kan vi komma åt varje element genom att använda tre subskript. Låt oss ta en 3-D-array - Vi kan betrakta en tredimensionell array som en array av 2-D-array, dvs varje element i en 3-D-array anses vara en 2-D-array. 3D-matrisen arr kan betraktas som en array som består av två element där varje element är en 2-D array. Namnet på arrayen arr är en pekare till 0:anth2-D array.

Alltså pekaruttrycket *(*(*(arr + i ) + j ) + k) är ekvivalent med det nedsänkta uttrycket arr[i][j][k].
Vi vet att uttrycket *(arr + i) är ekvivalent med arr[i] och uttrycket *(*(arr + i) + j) är ekvivalent med arr[i][j]. Så vi kan säga att arr[i] representerar basadressen för ith2-D array och arr[i][j] representerar basadressen för jth1-D array.

Exempel

iPhone emojis på Android

Exemplet nedan visar programmet för att skriva ut element av 3D-array med hjälp av pekare.

C




// C program to print the elements of 3-D> // array using pointer notation> #include> int> main()> {> >int> arr[2][3][2] = {> >{> >{5, 10},> >{6, 11},> >{7, 12},> >},> >{> >{20, 30},> >{21, 31},> >{22, 32},> >}> >};> >int> i, j, k;> >for> (i = 0; i <2; i++)> >{> >for> (j = 0; j <3; j++)> >{> >for> (k = 0; k <2; k++)> >printf>(>'%d '>, *(*(*(arr + i) + j) +k));> >printf>(>' '>);> >}> >}> >return> 0;> }>

>

>

Produktion

5 10 6 11 7 12 20 30 21 31 22 32>

Följande bild visar hur 3D-matrisen som används i programmet ovan lagras i minnet.

Prenumerera på en pekare till en array

Anta arr är en 2D-array med 3 rader och 4 kolumner och ptr är en pekare till en matris med 4 heltal, och ptr innehåller arrayens basadress arr .

int arr[3][4] = {{10, 11, 12, 13}, {20, 21, 22, 23}, {30, 31, 32, 33}}; int (*ptr)[4]; ptr = arr;>

Eftersom ptr är en pekare till den första radens 2D-matris, dvs en matris med 4 heltal, ptr + i kommer att peka på ithrad. Om hänvisning ptr + i , får vi basadress för ithrad. För att komma åt adressen till jthelement av ithrad kan vi lägga till j till pekaruttrycket *(ptr + i) . Alltså pekaruttrycket *(ptr + i) + j ger adressen till jthelement av ithrad och pekaruttrycket *(*(ptr + i)+j) ger värdet av jthelement av ithrad.
Vi vet att pekaruttrycket *(*(ptr + i) + j) är ekvivalent med nedsänkt uttryck ptr[i][j]. Så om vi har en pekarvariabel som innehåller basadressen för 2-D array, så kan vi komma åt elementen i arrayen genom att dubbelteckna den pekarvariabeln.

Exempel

C




// C program to print elements of a 2-D array> // by scripting a pointer to an array> #include> int> main()> {> >int> arr[3][4] = {> >{10, 11, 12, 13},> >{20, 21, 22, 23},> >{30, 31, 32, 33}> >};> >int> (*ptr)[4];> >ptr = arr;> >printf>(>'%p %p %p '>, ptr, ptr + 1, ptr + 2);> >printf>(>'%p %p %p '>, *ptr, *(ptr + 1), *(ptr + 2));> >printf>(>'%d %d %d '>, **ptr, *(*(ptr + 1) + 2), *(*(ptr + 2) + 3));> >printf>(>'%d %d %d '>, ptr[0][0], ptr[1][2], ptr[2][3]);> >return> 0;> }>

>

>

Produktion

0x7ffc9556b790 0x7ffc9556b7a0 0x7ffc9556b7b0 0x7ffc9556b790 0x7ffc9556b7a0 0x7ffc9556b7b0 10 22 33 10 22 33>