יום רביעי, 21 בדצמבר 2016

שפת C - מצביע למצביע (יום רביעי)

מצביע למצביע


מצביע יכול להצביע למצביע אחר עם כוכבית אחת פחות משלו (וכן הלאה "מצביע למצביע למצביע" עוד כוכביות)

הגדרה:
type  **PName; 
שימוש:
int x = 13,*p,**q;  
p = &x;                    
q = &p;                    
הפקודה q = &x לא חוקית!

אם הכתובת של x היא 600 , של p היא 850 ושל q היא 900
אז נתבונן במצב אחרי הפקודות:
x = 13         &x = 600      *x
p = 600      &p = 850      *p = 13        **p
q = 850      &q = 900      *q = 600      **q = 13





הקצאת מטריצה דינאמית:

int n = 5(שורות), m = 4(עמודות), **A;

נעבור לתוכנית:
#include <stdio.h>
#include <stdlib.h>
void main() {
 int n , m , **A , i , j;
 printf("Enter n & m:  ");
 scanf("%d %d",&n,&m);
 
 A = (int **)malloc(n * sizeof(int*) );
 if(A == NULL) {
  printf("No enough memory\n");
  exit(0);
 }
 
 for(i=0; i<n; i++) {
  A[i] = (int*) malloc(m * sizeof(int) );
  if(A[i] == NULL) {
   printf("No enouth memory\n");
   exit(0);
  }
 }
 
 
 for(i=0; i<n; i++) {
  printf("Enter %d numbers: ",m);
  for(j=0; j<m; j++)
   scanf("%d",&A[i][j]);
 }
 
 
 for(i=0; i<n; i++) {
  for(j=0; j<m; j++)
   printf("%4d",A[i][j]);
  putchar('\n');
 }
}
 

חשוב לדעת:
כל הביטויים הבאים שווים בערכם:
A[2][3]             
*(A[2]+3)         
*(*(A+2)+3)     
(*(A+2))[3]        

אולי את מה שאדום לא חייב לכתוב



עוד "מן סוג" של מטריצה דינאמית:

char*A[ ] = {"Shalom","Shlomo","Barak","Bush","klinton"};

נעקוב מה יהיה הפלט:
1 printf("%c",*(A[2]+4) );                 >> k
2 printf("%c",*(*(A+4)+3) );             >> n
3 printf("%c",**(A+4) );                    >> k
4 printf("%c",*(*A+3) );                    >> l
5 printf("%c",(*A)[0] );                      >> s
6 printf("%c",*(*(A+1)+2) );             >> l
7 printf("%c",(*A+1)[2] );                 >> l
8 printf("%c",*(*A+1) );                    >> h
9 printf("%c",*(*A)+1 );                    >> t (בגלל האסקי קוד)


נעקוב מה יהיו המחרוזות בפלט:
1 printf("%s",*A+2 );                  >> alom
2 printf("%s",*(A+2) );               >> Barak
3 printf("%s",A[3]+1 );               >> ush
4 printf("%s",*(A+4) );               >> Klinton
5 printf("%s",*A );                      >> Shalom
6 printf("%s",(A+3)[1] );            >> Klinton
שימו לב ש3 ו6 שונים!








תעמדו בקצב!



אין תגובות:

הוסף רשומת תגובה