Wypełnienie elementów tablicy ich adresami

0

Chciałbym zrobić coś takiego - wypełnić elementy tablic 10-elementowych adresami tych elementów. Tzn. żeby każda komórka tablicy miała wpisany swój adres w pamięci. Chodzi o czyste C oczywiście.

void wypelnij(int *tablica1,float *tablica2,double *tablica3)
{
	int i;
	
	for(i=0;i<10;i++)
	{	
		tablica1[i]=&tablica1[i];
	}
	for(i=0;i<10;i++)
	{	
		tablica2[i]=&tablica2[i];
	}
	for(i=0;i<10;i++)
	{	
		tablica3[i]=&tablica3[i];
	}
	printf("ENTER - dalej ...");
	getche();
	menu(); 		
}

Próbowałem to zrobić takim sposobem jw. ale mam error dla wszystkich pętli i się nie kompiluje. Kiedy zostawie tylko 1 pętle, żeby mi wypełniało tablice1 to działa dobrze(kompiluje się), ale z warrningiem - [warrning] assignment makes integer from pointer without a cast [enabled by default]. Próbowałem takiego czegoś : tablica1[i]=(int)&tablica1[i]; To wtedy ukazuje się warrining: [Warning] cast from pointer to integer of different size [-Wpointer-to-int-cast]

Próbowałem też takim sposobem :

	int i;
	int *p_tablica1;

	p_tablica1=&tablica1[0];
	for(i=0;i<10;i++,p_tablica1++)
	{	
		tablica1[i]=p_tablica1;
	}

Ale to samo co wyżej, identyczna sytuacja.
Nie mam pojęcia jak to zrobić, czy może zastosować tutaj tablice wskaźników i z niej przepisywać do tablicy1. Ale nie ogarniam tego. Dziękuję za pomoc.

0

o_O Próbujesz wpisać do tablicy intów wskaźniki do intów. Skąd wiesz że taki wskaźnik ma taki sam rozmiar jak int? Zwykle ma, ale to jest platform-dependent. Jak chcesz do tablicy wstawiać wskaźniki to zrób tablicę wskaźników.

0
 
int tablica[10];
for(int n=0; n<10; n++)
{
     tablica[n] = int( &tablica[0] ) + n;
}
 
void funkcja(int *tablica1, int *tablica2, int *tablica3)
{
     for(int n=0; n<10; n++)
     {
          *tablica1 = int( &tablica1[0] ) + n;
          *tablica2 = int( &tablica2[0] ) + n;
          *tablica3 = int( &tablica3[0] ) + n;
     }
}

Nie wiem czy tak da rade.

0

Zrobiłem tablice wskaźników, wpisuję do niej adresy i później do tablicy przepisuję tablicę wskaźników. Ale to chyba nadal nie działa poprawnie.

	int i;
	int *p_tablica[10];
	
	for(i=0;i<10;i++)
	{
		p_tablica[i]=&tablica1[i];
		tablica1[i]=p_tablica[i];
	} 

Jak to naprawić? : D
Nie łapie tego, to moje pierwsze starcie ze wskaźnikami, muszę załapać mechanizm, później będzie z górki.

0

Czy to nie głupie, że wskażnik wskazuje sam na siebie? Po co Ci to potrzebne??

0

Zadeklarować jeszcze wskaznik na tablice wskaznikow?

0

Masz wskaźnik

int *wsk 

. Wskazuje on na jakiś element np.

 
int liczba[3] = {10 , 5, 3};
int *wsk[3] = {&liczba[0], &liczba[1], &liczba[2]};

Jeżeli chcesz uzyskać wskaźnik na wskaźnik wsk to zadeklaruj sobie tablicę przechowującą wskaźniki na wskaźniki:

 
int **wsk2[3] = {&wsk[0], &wsk[1], &wsk[2]}; 

Jak to nie to to nie wiem już o co chodzi. Może opisz, do czego jest Ci to potrzebne to się coś wymysli :)

0

Po prostu jest takie zadanie, ćwiczenie umiejętności operowania wskaźnikami.
Z czego jednym podpunktem jest właśnie :
wpisanie do tablicy intów adresów tych elementów. Czyli pod indeksem np. tablica[X] ma się znajdować ADRES w pamięci elementu nr X tablicy.

0
 
int tablica[10] = {0,1,2,3,4,5,6,7,8,9}; //twoja tablica intów
int *wskazniki[10];
int n;
for(n=0; n<10; n++)
{
     wskazniki[n] = &tablica[n];
     tablica[n] = int(wskazniki[n]);
}
1

przede wszystkim, potrzebujesz tablicy wskaźników na inty, floaty, double — a nie tablicy intów, floatów, doubli.

void wypelnij( int* tablica1[], float* tablica2[], double* tablica3[])

ale po drugie, skoro elementy tablicy tablica1 są wskaźnikami na int, to adres elementu tablicy jest wskaźnikiem na wskaźnik do int. to nam trochę psuje — trzeba rzutować.

void wypelnij( int* tablica1[], float* tablica2[], double* tablica3[])
{
    int i;

    for(i=0;i<10;i++)
    {        
        tablica1[i] = (int*)&tablica1[i];
    }
    ...
}

Nie sprawdzane.

PS.
...Aaaale po trzecie, taki kod może wpadać w pułapkę zwaną „strict aliasing”.

1 użytkowników online, w tym zalogowanych: 0, gości: 1