מצביע למצביע
מצביע יכול להצביע למצביע אחר עם כוכבית אחת פחות משלו (וכן הלאה "מצביע למצביע למצביע" עוד כוכביות)
הגדרה:
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 שונים!
תעמדו בקצב!
אין תגובות:
הוסף רשומת תגובה