Witamy na forum PC Format Zapraszamy do REJESTRACJI


Użytkownicy przeglądający ten wątek: 1 gości

Help z wytłumaczenie | tablice wskażnikowe

#1
Help z wytłumaczenie | tablice wskażnikowe
Kto mi to wytłumaczy, wszystko, o co tu chodzi


Kod:
#include <stdio.h>
#define K 4
#define W 4

void swap( int *m[W], const int w1, const int w2)  { //omg co to znaczy int *m[W] nigdzie czegoś takiego nie spotkałem,

 int *temp = m[w1];
 m[w1] = m[w2];
 m[w2] = temp;

}

int main( void )  {

 int *m[W] = { (int[K]){ 3, 5, 1, 4 }, (int[K]){ 0, 0, 0, 0 },
       (int[K]){ 9, 2, 4, 8 }, (int[K]){ 0, 0, 0, 0 } };
//co to za inicjalizacja dziwna i dlaczego taka

  swap( m, 0, 2);  //zamień wiersz 0 z 2

   for( int j...)   printf("%d", m[i][j]); //dlaczego moge sie odwoływać po przez np. m[1][2]
a nie np. **coś tam



 return 0;

}
thx Uścisk
 System operacyjny: windows_seven Przeglądarka: chrome
#2
RE: Help z wytłumaczenie | tablice wskażnikowe
Kod:
int *m[W]
Deklaracja 4-elementowej tablicy wskaźników.
Kod:
int *m[W] = { (int[K]){ 3, 5, 1, 4 }, (int[K]){ 0, 0, 0, 0 }, (int[K]){ 9, 2, 4, 8 }, (int[K]){ 0, 0, 0, 0 } };
Jest to coś niezgodnego ze standardem, bo g++ uznaje to za błąd (pobranie adresu do tymczasowej tablicy).
Zapis
Kod:
m[i][j]
odpowiada zapisowi
Kod:
*(*(m+i)+j)
zatem jeśli napiszesz
Kod:
**m
to już zapewne widzisz, do którego elementu tablicy się odwołasz Wesoły
 System operacyjny: linux_ubuntu Przeglądarka: firefox
#3
RE: Help z wytłumaczenie | tablice wskażnikowe
o co z tym chodzi? 'pobranie adresu do tymczasowej tablicy'
dlaczego jak użyłem normalnej tablicy m[3][4] zamiast tego co ci nie działa, to mi nie działa program
 System operacyjny: windows_seven Przeglądarka: chrome
#4
RE: Help z wytłumaczenie | tablice wskażnikowe
W tamtym wyrażeniu znajdują się 4 tymczasowe tablice. Jeśli używasz jakiegoś wiekowego kompilatora (np. tego w środowisku Dev-C++), to program ma szansę działać.
Ja musiałem nieco zmienić, przez co program nieco inaczej działa:
Kod:
#include <stdio.h>
#define K 4
#define W 4

void swap( int *m[W], const int w1, const int w2)  {

    int *temp = m[w1];
    m[w1] = m[w2];
    m[w2] = temp;

}

int main( void )  {

    int n[][K] = { { 3, 5, 1, 4 }, { 0, 0, 0, 0 }, { 9, 2, 4, 8 }, { 0, 0, 0, 0 } };
    int *m[W] = {(int*)n, (int*)(n+1), (int*)(n+2), (int*)(n+3)};
    swap( m, 0, 2);  //zamień wiersz 0 z 2

    for (int i = 0; i < W; i++)
        for(int j = 0; j < K; j++)
            printf("%d ", m[i][j]);

    return 0;
}
 System operacyjny: linux_ubuntu Przeglądarka: firefox
#5
RE: Help z wytłumaczenie | tablice wskażnikowe
O rety
Kod PHP:
int n[][K] = { { 351}, { 000}, { 924}, { 000} };
 
  int *m[W] = {(int*)n, (int*)(n+1), (int*)(n+2), (int*)(n+3)}; 

co to oznacza? 1 zwykła tablica, drugie tablica, w której każdy element ma przechowywać wiersz, 
jest rozpisany każdy element, ale jak jest przekazany każdy wiersz (int*)n to nie rozumiem, jak to działa....




tak się zastanawiam, przy użyciu tablicy wskażników, przypisując im tablice jednowymiarowe, robimy jakby jedną tablice wielowymiarową
Kod:
int *W[3]={{3,6,4,7}};
int tab[2];
int tab[4];
w[1] = tab;
*(w + 2) = tab1;

dobrze tutaj mi się myśli?
 System operacyjny: windows_seven Przeglądarka: chrome
#6
RE: Help z wytłumaczenie | tablice wskażnikowe
Tablica n to jedna duża tablica, a w tablicy m trzymam wskaźniki na te mniejsze tablice. Musiałem użyć rzutowania, ponieważ (w moim przypadku) n jest wskaźnikiem na 4-elementową tablicę.
Jeśli dobrze rozumiem to, co chciałeś przekazać (jakiś błąd wkradł się do kodu), to dobrze myślisz.
 System operacyjny: linux_ubuntu Przeglądarka: firefox
#7
RE: Help z wytłumaczenie | tablice wskażnikowe
jaki bład,
Kod:
int *m[W] = {(int*)n, (int*)(n+1), (int*)(n+2), (int*)(n+3)};
tego dalej nie rozumiem

Ale o co chodzi z tym rzutowaniem, bo jeśli chce zapisać tablice do tablicy wskażników, to do tej tablica musze wpisać po kolei po jednym wierszu do tej tablicy wskażników , ale
int *m[W] = {(int*)n, (int*)(n+1), (int*)(n+2), (int*)(n+3)}; nie rozumiem, jak to robisz, i na czym to polega, może nie wiem czegoś, bo ja znam tylko rzutowanie np. z float na int itd.

lol Wesoły zrobiłem to po prostu tak,
z tym rzutowaniem to możesz mi wytłumaczyć jak chcesz,będe wdzięczny

Kod PHP:
int n[][K] = { { 351}, { 000}, { 924} };
    
int *m[W] ;
    
int j,i;
    for( 
03; ++i)
        
m[i] = n[i]; 
 System operacyjny: windows_seven Przeglądarka: chrome
#8
RE: Help z wytłumaczenie | tablice wskażnikowe
Jednak można użyć poniższej konstrukcji
Kod:
int a[4][4];
int *b[4] = {a[0], a[1], a[2], a[3]};
bez potrzeby rzutowania.
 System operacyjny: linux_ubuntu Przeglądarka: firefox
#9
RE: Help z wytłumaczenie | tablice wskażnikowe
Jest pewna niezgodność, jeśli zerknie ktoś
Kod PHP:
#include <stdio.h>
#define K 4
#define W 3
 
int main(void)
{
    
int n[][K] = { { 351}, { 000}, { 924} };
    
intm[W];
    
int ji;
    for (
03; ++i)
      *( 
i) = i;  //dlaczego musze tutaj dać gwiazdkę w *(n + i) ,przeciez nie chce dac wartosci i-tego  elementu, tylko jego
      // adres, program dziala dobrze ale dluzej i pisze assignment from incompatible pointer type, a sam mowiles, aby sie odwolac
      // "do adresu wiersza tablicy to bez gwiazdki
      //Jak dasz jedną gwiazdkę, to odwołasz się do adresu elementu w tablicy trzyelementowej. Jak dasz dwie gwiazdki, to odwołasz 
      //się do wartości tego elementu. Jak nie dasz gwiazdki, to odwołasz się do adresu tablicy trzyelementowej. Jeśli dasz np."

 
    
intp;                     
    
1;               // assignment from incompatible pointer type to samo, ja chce przypisac wierz, a nie element
  
    
return 0;

 System operacyjny: windows_seven Przeglądarka: chrome
#10
RE: Help z wytłumaczenie | tablice wskażnikowe
Zmienna m jest tablicą wskaźników, zatem w pierwszym wypadku
Kod:
m[i] = n[i];
a w drugim
Kod:
p = n[1];
Wyrażenie n[i] (lub *(n+i)) jest adresem, czyli można go przypisać do wskaźnika, z kolei n+i jest wskaźnikiem na tablicę, zatem nie można go bezpośrednio przypisać do zwykłego wskaźnika.
 System operacyjny: linux_ubuntu Przeglądarka: firefox
Programy: Polecane / Nowe / Inne




Podobne wątki (Help z wytłumaczenie | tablice wskażnikowe)
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
  Tablice dwuwymiarowe a wskażniki soul1648 4 9685 22.03.2017, 21:58
Ostatni post: soul1648
  Android zamiana Bitmap na Tablice typu byte aht 2 10460 08.02.2016, 11:20
Ostatni post: aht
  [PASCAL] Tablice Kowal. 1 9290 07.06.2015, 14:07
Ostatni post: broda99

Skocz do: