Co oznacza zapis (*p)?

0

Nie rozumiem co oznacza zapis (*p) i *(*p+i) w 7 i 13 linijce. Mógłby ktoś wytłumaczyć? Dziękuję za odpowiedzi

#include <stdio.h> 
#define N 3

int main()
{
  int x[N][N] = {{1, 2, 3},{ 4, 5, 6}, {7, 8, 9}}; 
  int (*p)[N] = x;
  
  for(int j=0; j<N; j++) 
  { 
      for(int i=0; i<N; i++) 
          {
              printf("%3d ", *(*p+i));
          }
          p++;
          printf("\n");
      }
  return 0;
}
4

Poczytaj o wskaźnikach i wskaźnikach na tablicę, arytmetyce wskaźników itp

0

Linijka 7 to definicja tablicy p zawierającej N wskaźników do funkcji zwracających int.

4

Generalnie to co podałeś jest niepotrzebnym zagmatwaniem następującego kodu:

#include <stdio.h> 
#define N 3

typedef int cols[N];

int main()
{
	cols tb[N]={{1,2,3},{4,5,6},{7,8,9}};
	cols *p=tb;
	
	for(int y=0;y<N;++y) 
	{ 
		for(int x=0;x<N;++x) printf("%3d ",(*p)[x]);
		//for(int x=0;x<N;++x) printf("%3d ",x[*p]);
		//for(int x=0;x<N;++x) printf("%3d ",*(*p+x));
		++p;
		printf("\n");
	}
	return 0;
}

Wszystkie 3 fory wewnętrzne robią to samo. Aczkolwiek nawet ten niezagmatwany nie ma sensu bo (dzięki istnieniu cash procesora) będzie działać wolniej niż zwykły:

#include <stdio.h> 
#define N 3

int main()
{
	int tb[N][N]={{1,2,3},{4,5,6},{7,8,9}}; 
	
	for(int y=0;y<N;++y)
	{
		for(int x=0;x<N;++x) printf("%3d ",tb[y][x]);
		printf("\n");
	}
	return 0;
}

Co osobiście zapisałbym następująco:

#include <stdio.h> 
#define N 3

int main()
{
	int tb[N][N]={{1,2,3},{4,5,6},{7,8,9}}; 
	for(int y=0;y<N;++y,printf("\n")) for(int x=0;x<N;++x) printf("%3d ",tb[y][x]);
	return 0;
}

Prawdopodobnie komuś chciało się zademonstrować jak nie należy kodować.

5

@Pysa6:
Do "dekodowania" deklaracji C polecam stronkę https://www.cdecl.org/

https://www.cdecl.org/?q=int+%28*p%29%5B10%5D%3B

int (*p)[10];
declare p as pointer to array 10 of int
1

Wydaje mi się, że ktoś chciał sprawdzić czy obczaisz różnicę:

int *p[5] tablica pięciu pointerów do int
int (*p)[5] pointer do tablicy pięciu intów.

Sory za kulawe nazwy. W ramach samorozwoju zastanów się czy oba wolno przekazać do funkcji która bierze **int.

Pozdrawiam i życzę dalszej nauki.

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