intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Chương 2: Mảng và con trỏ (array and pointer)

Chia sẻ: Lê Trang | Ngày: | Loại File: DOC | Số trang:55

98
lượt xem
10
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Mảng là một tập cố định các phần tử cùng có chung một kiểu dữ liệu được lưu trữ kế tiếp nhau trong bộ nhớ. Các thao tác trên mảng bao gồm: tạo lập mảng (create), tìm kiếm một phần tử của mảng (retrieve), lưu trữ mảng (store). Ngoài giá trị, mỗi phần tử của mảng còn được đặc trưng bởi chỉ số của nó (index). Index của một phần tử thể hiện thứ tự của phần tử đó trong mảng. Không có các thao tác bổ sung thêm phần tử hoặc loại bỏ phần tử của mảng vì...

Chủ đề:
Lưu

Nội dung Text: Chương 2: Mảng và con trỏ (array and pointer)

  1. Ch¬ng 2 M¶ng vµ con trá (array and pointer) 2.1- CÊu tróc lu tr÷ m¶ng 2.1.1- Kh¸i niÖm vÒ m¶ng M¶ng lµ mét tËp cè ®Þnh c¸c phÇn tö cïng cã chung mét kiÓu d÷ liÖu ®îc lu tr÷ kÕ tiÕp nhau trong bé nhí. C¸c thao t¸c trªn m¶ng bao gåm: t¹o lËp m¶ng (create), t×m kiÕm mét phÇn tö cña m¶ng (retrieve), lu tr÷ m¶ng (store). Ngoµi gi¸ trÞ, mçi phÇn tö cña m¶ng cßn ®îc ®Æc trng bëi chØ sè cña nã (index). Index cña mét phÇn tö thÓ hiÖn thø tù cña phÇn tö ®ã trong m¶ng. Kh«ng cã c¸c thao t¸c bæ sung thªm phÇn tö hoÆc lo¹i bá phÇn tö cña m¶ng v× sè phÇn tö trong m¶ng lµ cè ®Þnh. Mét m¶ng mét chiÒu gåm n phÇn tö ®îc coi nh mét vector n thµnh phÇn ®îc ®¸nh sè tõ 0, 1, 2, . . ., n-1. Chóng ta cã thÓ më réng kh¸i niÖm m¶ng mét chiÒu cho m¶ng nhiÒu chiÒu nh sau: Mét m¶ng mét chiÒu gåm n phÇn tö, trong ®ã mçi phÇn tö cña nã l¹i lµ mét m¶ng mét chiÒu gåm m phÇn tö ®îc gäi lµ mét m¶ng hai chiÒu gåm n× m phÇn tö. Tæng qu¸t, mét m¶ng gåm n phÇn tö mµ mçi phÇn tö cña nã l¹i lµ mét m¶ng k - 1 chiÒu th× nã ®îc gäi lµ m¶ng k chiÒu. Sè phÇn tö cña m¶ng k chiÒu lµ tÝch sè gi÷a sè c¸c phÇn tö cña mçi m¶ng mét chiÒu. Khai b¸o m¶ng mét chiÒu ®îc thùc hiÖn theo qui t¾c nh sau: Tªn_kiÓu Tªn_biÕn[Sè_phÇn tö]; Ch¼ng h¹n víi khai b¸o: int A[10]; /* khai b¸o m¶ng gåm 10 phÇn tö nguyªn*/ char str[20]; /* khai b¸o m¶ng gåm 20 kÝ tù */ float B[20]; /* khai b¸o m¶ng gåm 20 sè thùc */ long int L[20]; /* khai b¸o m¶ng gåm 20 sè nguyªn dµi */ 2.1.2- CÊu tróc lu tr÷ cña m¶ng mét chiÒu CÊu tróc lu tr÷ cña m¶ng: M¶ng ®îc tæ chøc trong bé nhí nh mét vector, mçi thµnh phÇn cña vector ®îc t¬ng øng víi mét « nhí cã kÝch cì ®óng b»ng kÝch cì cña kiÓu phÇn tö vµ ®îc lu tr÷ kÕ tiÕp nhau trong bé nhí. NÕu chóng ta cã khai b¸o m¶ng gåm n phÇn tö th× phÇn tö ®Çu tiªn lµ phÇn tö thø 0 vµ phÇn tö cuèi cïng lµ phÇn tö thø n - 1, ®ång thêi m¶ng ® îc cÊp ph¸t mét vïng kh«ng gian nhí liªn tôc cã sè byte ®îc tÝnh theo c«ng thøc: KÝch_cì_m¶ng = ( Sè_phÇn_tö * sizeof (kiÓu_phÇn_tö). 35
  2. Ch¼ng h¹n trong cã khai b¸o: int A[10]; Khi ®ã kÝch cì tÝnh theo byte cña m¶ng lµ : 10 *sizeof(int) = 20 byte; float B[20]; => m¶ng ®îc cÊp ph¸t: 20 * sizeof(float) = 80byte; Ch¬ng tr×nh dÞch cña ng«n ng÷ C lu«n qui ®Þnh tªn cña m¶ng ®ång thêi lµ ®Þa chØ phÇn tö ®Çu tiªn cña m¶ng trong bé nhí. Do vËy, nÕu ta cã mét kiÓu d÷ liÖu nµo ®ã lµ Data_type, tªn cña m¶ng lµ X, sè ph©n tö cña m¶ng lµ N th× m¶ng ®îc tæ chøc trong bé nhí nh sau: Data_type X[N]; X[0] X[1] X[2] X[3] . . . . . . . X[N- X - lµ ®Þa chØ ®Çu tiªn cña m¶ng. X = &X[0] = ( X + 0 ); &X[1] = ( X + 1 ); ............................ &X[i] = (X + i ); VÝ dô 2.1. KiÓm tra cÊu tróc lu tr÷ cña m¶ng trong bé nhí cña m¶ng mét chiÒu. #include #include #include #include void main(void) { int A[10], i ; /* khai b¸o m¶ng gåm 10 biÕn nguyªn */ printf(“\n §Þa chØ ®Çu cña m¶ng A lµ : %p”, A); printf(“\n KÝch cì cña m¶ng : %5d byte”, 10 * sizeof(int)); for ( i =0 ; i
  3. §Þa chØ ®Çu cña m¶ng: FFE2 KÝch cì cña m¶ng : 20 §Þa chØ phÇn tö thø 0 = FFE2 §Þa chØ phÇn tö thø 1 = FFE4 §Þa chØ phÇn tö thø 2 = FFE6 §Þa chØ phÇn tö thø 3 = FFE8 §Þa chØ phÇn tö thø 4 = FFEA §Þa chØ phÇn tö thø 5 = FFEC §Þa chØ phÇn tö thø 6 = FFEE §Þa chØ phÇn tö thø 7 = FFF0 §Þa chØ phÇn tö thø 8 = FFF2 §Þa chØ phÇn tö thø 9 = FFF4 VÝ dô 2.1 in ra ®Þa chØ cña c¸c phÇn tö trong m¶ng A gåm 10 phÇn tö nguyªn. KÕt qu¶ nh ®îc ®a ra ë trªn cho ta thÊy ®Þa chØ cña m¶ng trong bé nhí trïng víi ®Þa chØ cña phÇn tö A[0] ®Òu b»ng FFE2, tiÕp ®Õn c¸c phÇn tö ®îc lu tr÷ kÕ tiÕp vµ c¸ch nhau ®óng b»ng kÝch cì cña kiÓu int. B¹n ®äc cã thÓ dïng ch¬ng tr×nh ®¬n gi¶n nµy ®Ó kiÓm tra cÊu tróc l u tr÷ cña m¶ng cho c¸c kiÓu d÷ liÖu kh¸c. 2.1.3- CÊu tróc lu tr÷ m¶ng nhiÒu chiÒu §a sè c¸c ng«n ng÷ kh«ng h¹n chÕ sè chiÒu cña m¶ng, chÕ ®é cÊp ph¸t bé nhí cho m¶ng nhiÒu chiÒu ®îc thùc hiÖn theo c¬ chÕ u tiªn theo hµng. Khai b¸o m¶ng nhiÒu chiÒu : Data_type tªn_biÕn[sè_chiÒu_1] [sè_chiÒu_2]. . . [sè_chiÒu_n] int A[3][3]; khai b¸o m¶ng hai chiÒu gåm 9 phÇn tö nguyªn ®îc lu tr÷ liªn tôc tõ A[0][0] , A[0][1] , A[0][2] , A[1][0] , A[1][0] , A[1][1] , A[1][2] , A[2][0] , A[2] [1] , A[2][2] ; VÝ dô 2.2 . KiÓm tra cÊu tróc lu tr÷ cña b¶ng hai chiÒu trong bé nhí. #include #include #include #include void main(void) { 37
  4. float A[3][3] ; /* khai b¸o m¶ng hai chiÒu gåm 9 phÇn tö nguyªn*/ int i, j; /* §Þa chØ cña c¸c hµng*/ for(i=0; i
  5. C¸c thao t¸c ®èi víi m¶ng bao gåm : t¹o lËp m¶ng, t×m kiÕm phÇn tö cña m¶ng, lu tr÷ m¶ng. C¸c thao t¸c nµy cã thÓ ®îc thùc hiÖn ngay tõ khi khai b¸o m¶ng. Chóng ta cã thÓ võa khai b¸o m¶ng võa khëi ®Çu cho m¶ng, nh ng cÇn chó ý mét sè kü thuËt khëi ®Çu cho m¶ng ®Ó võa ®¹t ® îc môc ®Ých ®Ò ra võa tiÕt kiÖm bé nhí. Ch¼ng h¹n víi khai b¸o int A[10] = { 5, 7, 2, 1, 9 }; ch¬ng tr×nh vÉn ph¶i cÊp ph¸t cho m¶ng A kÝch cì 10 * sizeof(int) = 20 byte bé nhí, trong khi ®ã sè byte cÇn thiÕt thùc sù cho m¶ng chØ lµ 5 * sizeof(int) = 10 byte. §Ó tr¸nh l·ng phÝ bé nhí, chóng ta cã thÓ võa khai b¸o võa ®ång thêi khëi ®Çu cho m¶ng nh sau. int A[] = { 5, 7, 2, 1, 9 }; Víi c¸ch khai b¸o nµy, miÒn bé nhí cÊp ph¸t cho m¶ng chØ lµ sè c¸c sè nguyªn ®îc khëi ®Çu trong d·y vµ b»ng 5 * sizof(int) = 10 byte. Sau ®©y lµ mét sè vÝ dô minh häa cho c¸c thao t¸c xö lý m¶ng mét vµ nhiÒu chiÒu. VÝ dô 2.3. T¹o lËp m¶ng c¸c sè thùc gåm n phÇn tö , t×m phÇn tö lín nhÊt vµ chØ sè cña phÇn tö lín nhÊt trong m¶ng. #include #include #include #include #define MAX 100 /*sè phÇn tö tèi ®a trong m¶ng*/ void main(void) { float A[MAX], max; int i, j, n; /* Khëi t¹o m¶ng sè */ printf(“\n NhËp sè phÇn tö cña m¶ng n=”); scanf(“%d”, &n); for(i=0; i
  6. } printf(“\n ChØ sè cña phÇn tö lín nhÊt lµ : %d”,j); printf(“\n Gi¸ trÞ cña phÇn tö lín nhÊt lµ: %6.2f”, max); getch(); } KÕt qu¶ thùc hiÖn ch¬ng tr×nh: NhËp sè phÇn tö cña m¶ng n=7 Nhap A[0]=1 Nhap A[1]=9 Nhap A[2]=2 Nhap A[3]=8 Nhap A[4]=3 Nhap A[5]=7 Nhap A[6]=4 ChØ sè cña phÇn tö lín nhÊt lµ : 1 Gi¸ trÞ cña phÇn tö lín nhÊt lµ : 9 VÝ dô 2.4. T¹o lËp ma trËn cÊp m x n vµ t×m phÇn tö lín nhÊt, nhá nhÊt cña ma trËn. #include #include #include #include #define M 20 #define N 20 void main(void){ float A[M][N], max, t; int i, j, k, p, m, n; clrscr(); printf(“\n NhËp sè hµng cña ma trËn:”); scanf(“%d”, &m); printf(“\n NhËp sè cé cña ma trËn:”); scanf(“%d”, &n); for(i=0; i
  7. printf(“\n NhËp A[%d][%d] =”, i,j); scanf(“%f”, &t); A[i][j]=t; } } max=A[0][0]; k=0; p=0; for(i=0; i
  8. §Ó gi¶i quyÕt bµi to¸n, chóng x©y dùng ch¬ng tr×nh thµnh 3 hµm riªng biÖt: hµm Init_Array() cã nhiÖm vô t¹o lËp m¶ng sè A[n], hµm Sort_Array() thùc hiÖn viÖc s¾p xÕp d·y c¸c sè ®îc lu tr÷ trong m¶ng, hµm In_Array() in l¹i kÕt qu¶ sau khi m¶ng ®· ®îc s¾p xÕp. #include #include #include #include #define MAX 100 /* Khai b¸o nguyªn mÉu cho hµm */ void Init_Array ( float A[], int n); void Sort_Array( float A[], int n); void In_Array( float A[], int n); /* M« t¶ hµm */ /* Hµm t¹o lËp m¶ng sè */ void Init_Array( float A[], int n) { int i; for( i = 0; i < n; i++ ) { printf(“\n NhËp A[%d] = “, i); scanf(“%f”, &A[i]); } } /* Hµm s¾p xÕp m¶ng sè */ void Sort_Array( float A[], int n ){ int i , j ; float temp; for(i=0; iA[j]) { temp = A[i]; A[i] = A[j]; A[j] = temp; } } } 42
  9. } /* Hµm in m¶ng sè */ void In_Array ( float A[], int n) { int i; for(i=0; i
  10. /*M« t¶ hµm */ void Init_Matrix( float A[M][N], int m, int n, char ten) { int i, j; float temp; clrscr(); for(i=0; i
  11. float A[M][N], B[M][N], C[M][N]; int n, m; clrscr(); printf(“\n NhËp sè hµng m =”); scanf(“%d”, &m); printf(“\n NhËp sè cét n =”); scanf(“%d”, &n); Init_Matrix(A, m, n, ‘A’); Init_Matrix(B, m, n, ‘B’); Tong_Matrix(A, B, C, m, n); In_Matrix(C, m, n); } 2.4- X©u kÝ tù (string) X©u kÝ tù lµ mét m¶ng trong ®ã mçi phÇn tö cña nã lµ mét kÝ tù, kÝ tù cuèi cïng cña x©u ®îc dïng lµm kÝ tù kÕt thóc x©u. KÝ tù kÕt thóc x©u ®- îc ng«n ng÷ C qui ®Þnh lµ kÝ tù ‘\0’, kÝ tù nµy cã m· lµ 0 (NULL) trong b¶ng m· ASCII. VÝ dô trong khai b¸o : char str[]=’ABCDEF’ khi ®ã x©u kÝ tù ®îc tæ chøc nh sau: 0 1 2 3 4 5 6 A B C D E F ‘\0’ Khi ®ã str[0] = ‘A’; str[1] = ‘B’, . ., str[5]=’F’, str[6]=’\0’; V× kÝ hiÖu kÕt thóc x©u cã m· lµ 0 nªn chóng ta cã thÓ kiÓm chøng tæ chøc lu tr÷ cña x©u th«ng qua ®o¹n ch¬ng tr×nh sau: VÝ dô 2.7. In ra tõng kÝ tù trong x©u. #include #include #include #include #include #include /* sö dông hµm xö lý x©u kÝ tù gets() */ void main(void) { char str[20]; int i =0; printf(“\n NhËp x©u kÝ tù:”); gets(str); /* nhËp x©u kÝ tù tõ bµn phÝm */ while ( str[i]!=’\0’){ 45
  12. putch(c); i++; } } Ghi chó: Hµm getch() nhËn mét kÝ tù tõ bµn phÝm, hµm putch(c) ® a ra mµn h×nh kÝ tù c. Hµm sacnf(“%s”, str) : nhËn mét x©u kÝ tù tõ bµn phÝm nhng kh«ng ®îc chøa kÝ tù trèng (space), hµm gets(str) : cho phÐp nhËn tõ bµn phÝm mét x©u kÝ tù kÓ c¶ dÊu trèng. Ng«n ng÷ C kh«ng cung cÊp c¸c phÐp to¸n trªn x©u kÝ tù, mµ mäi thao t¸c trªn x©u kÝ tù ®Òu ph¶i ®îc thùc hiÖn th«ng qua c¸c lêi gäi hµm. Sau ®©y lµ mét sè hµm xö lý x©u kÝ tù th«ng dông ®îc khai b¸o trong tÖp string.h: puts (string) : §a ra mµn h×nh mét string. gets(string) : NhËn tõ bµn phÝm mét string. scanf(“%s”, string) : NhËn tõ bµn phÝm mét string kh«ng kÓ kÝ tù trèng (space) . strlen(string): Hµm tr¶ l¹i mét sè lµ ®é dµi cña string. strcpy(s,p) : Hµm copy x©u p vµo x©u s. strcat(s,p) : Hµm nèi x©u p vµo sau x©u s. strcmp(s,p) : Hµm tr¶ l¹i gi¸ trÞ d¬ng nÕu x©u s lín h¬n x©u p, tr¶ l¹i gi¸ trÞ ©m nÕu x©u s nhá h¬n x©u p, tr¶ l¹i gi¸ trÞ 0 nÕu x©u s ®óng b»ng x©u p. strstr(s,p) : Hµm tr¶ l¹i vÞ trÝ cña x©u p trong x©u s, nÕu p kh«ng cã mÆt trong s hµm tr¶ l¹i con trá NULL. strncmp(s,p,n) : Hµm so s¸nh n kÝ tù ®Çu tiªn cña x©u s vµ p. strncpy(s,p,n) : Hµm copy n kÝ tù ®Çu tiªn tõ x©u p vµo x©u s. strrev(str) : Hµm ®¶o x©u s theo thø tù ngîc l¹i. Chóng ta cã thÓ sö dông trùc tiÕp c¸c hµm xö lý x©u kÝ tù b»ng viÖc khai b¸o chØ thÞ #include . Tuy nhiªn , chóng ta cã thÓ viÕt l¹i c¸c thao t¸c ®ã th«ng qua vÝ dô sau: VÝ dô 2.8. X©y dùng c¸c thao t¸c sau cho string: F1- NhËp x©u kÝ tù tõ bµn phÝm hµm gets(str). F2- T×m ®é dµi x©u kÝ tù strlen(str). F3- T×m vÞ trÝ kÝ tù C ®Çu tiªn xuÊt hiÖn trong x©u kÝ tù. F4- §¶o ngîc x©u kÝ tù. F5- §æi x©u kÝ tù tõ in thêng thµnh in hoa. F6- S¾p xÕp x©u kÝ tù theo thø tù t¨ng dÇn. . . 46
  13. /* C¸c thao t¸c víi x©u kÝ tù */ #include #include #include #include #include #include #define F1 59 #define F2 60 #define F3 61 #define F4 62 #define F5 63 #define F6 64 #define F7 65 #define F10 68 #define MAX 256 /* khai b¸o nguyªn mÉu cho hµm */ char *gets (char str[]); /* char * ®îc hiÓu lµ mét x©u kÝ tù */ int strlen(char str[]); /* hµm tr¶ l¹i ®é dµi x©u */ int strcstr(char str[], char c); /* hµm tr¶ l¹i vÞ trÝ kÝ tù c ®Çu tiªn trong str*/ char *strrev(char str[]);/* hµm ®¶o x©u str*/ char *upper(char str[]); /* hµm ®æi x©u str thµnh ch÷ in hoa*/ char *sort_str(char str[]); /* hµm s¾p xÕp x©u theo thø tù tõ ®iÓn*/ void thuc_hien(void); /* M« t¶ hµm */ /* Hµm tr¶ l¹i mét x©u kÝ tù ®îc nhËp tõ bµn phÝm*/ char *gets( char str[] ) { int i=0; char c; while ( ( c=getch())!=’\n’) { /* nhËp nÕu kh«ng ph¶i phÝm enter*/ str[i] = c; i++; } 47
  14. str[i]=’\0’; return(str); } /* Hµm tÝnh ®é dµi x©u kÝ tù: */ int strlen(char str[]) { int i=0; while(str[i]) i++; return(i); } /* Hµm tr¶ l¹i vÞ trÝ ®Çu tiªn kÝ tù c trong x©u str*/ int strcstr (char str[] , char c) { int i =0; while (str[i] && str[i] != c ) i++; if(str[i]=’\0’ ) return(-1); return(i); } /* Hµm ®¶o x©u kÝ tù */ char *strrev( char str[]) { int i , j , n=strlen(str); char c; i = 0; j = n-1; while (i < j) { c = str[i] ; str[i] = str [j] ; str[j] =c; } return(str); } /* Hµm ®æi x©u in thêng thµnh in hoa */ char * upper( char str[] ) { int i, n=strlen(str); for(i=0;i=’a’ && str[i]
  15. str[i]=str[i] - 32; } return(str); } /* Hµm s¾p xÕp x©u kÝ tù */ char *sort_str( char str[] ) { int i, j , n = strlen(str); char temp; for (i =0; i
  16. switch(phim){ case F1: gets(str); control=1; break; case F2: if (control) printf(“\n §é dµi x©u lµ:%d”, strlen(str)); break; case F3: if (control){ printf(“\n KÝ tù cÇn t×m:”); scanf(“%c”, &c); if(strcstr(str, c)>=0) printf(“\n VÞ trÝ:%d”,strcstr(str,c)); } break; case F4: if (control) printf(“\n X©u ®¶o:%s”, strrev(str)); break; case F5: if (control) printf(“\n In hoa:%s”, upper(str)); break; case F6: if (control) printf(“\n X©u ®îc s¾p xÕp:%s”, sort_str(str)); break; } delay(2000); } while(phim!=F10); } /* ch¬ng tr×nh chÝnh */ 50
  17. void main(void) { thuc_hien(); } M¶ng c¸c string: m¶ng c¸c string lµ mét m¶ng mµ mçi phÇn tö cña nã lµ mét string. Ch¼ng h¹n trong khai b¸o char buffer[25][80]; lµ m¶ng c¸c string gåm 25 hµng trong ®ã mçi hµng gåm 80 kÝ tù. VÝ dô sau ®©y sÏ minh häa cho c¸c thao t¸c trªn m¶ng c¸c string. VÝ dô 2.9. H·y t¹o lËp m¶ng c¸c string trong ®ã mçi string lµ mét tõ kho¸ cña ng«n ng÷ lËp tr×nh C. S¾p xÕp m¶ng c¸c tõ kho¸ theo thø tù tõ ®iÓn. Ch¬ng tr×nh sau sÏ ®îc thiÕt kÕ thµnh 3 hµm chÝnh: Hµm Init_KeyWord(): thiÕt lËp b¶ng tõ kho¸, hµm Sort_KeyWord(): s¾p xÕp m¶ng tõ kho¸, hµm In_KeyWord(): in m¶ng c¸c tõ kho¸. Ch¬ng tr×nh ®îc thùc hiÖn nh sau: /* Thao t¸c víi m¶ng c¸c string */ #include #include #include #include #include #include #include /* Khai b¸o nguyªn mÉu cho hµm*/ void Init_KeyWord( char key_word[][20], int n);// nhËp tõ kho¸ void Sort_KeyWord(char key_word[][20], int n);// s¾p xÕp tõ kho¸ void In_KeyWord(char key_word[][20], int n);// in c¸c tõ kho¸ ra mµn h×nh /* M« t¶ hµm */ void Init_KeyWord( char key_word[][20], int n) { int i; for( i = 0; i< n; i++){ printf(“\n NhËp tõ kho¸ %d :”,i); 51
  18. scanf(“%s”, key_word[i]); } } void Sort_KeyWord(char key_word[][20], int n) { int i, j; char temp[20]; for( i = 0; i 0 ){ strcpy(temp, key_word[i] ); strcpy(key_word[i], key_word[j] ); strcpy(key_word[j], temp ); } } } } void In_KeyWord(char key_word[][20], int n) { int i; for ( i = 0; i < n; i++){ printf(“\n Key_Word[%d] = %s”, i, key_word[i]); } getch(); } void main(void) { char key_word[100][20]; int n; printf(“\n NhËp sè tõ kho¸ n = “); scanf(“%d”, &n); Init_KeyWord(key_word, n); Sort_KeyWord(key_word, n); In_KeyWord(key_word, n); } 2.5- Con trá (Pointer) 52
  19. Con trá lµ biÕn chøa ®Þa chØ cña mét biÕn kh¸c. Con trá ®îc sö dông rÊt nhiÒu trong C vµ ®îc coi lµ thÕ m¹nh trong biÓu diÔn tÝnh to¸n vµ truy nhËp gi¸n tiÕp c¸c ®èi tîng. 2.5.1. C¸c phÐp to¸n trªn con trá §Ó khai b¸o con trá, chóng ta thùc hiÖn theo có ph¸p: KiÓu_d÷_liÖu * BiÕn_con_trá; V× con trá chøa ®Þa chØ cña ®èi tîng nªn cã thÓ th©m nhËp vµo ®èi t- îng “gi¸n tiÕp” th«ng qua con trá. Gi¶ sö x lµ mét biÕn kiÓu int vµ px lµ con trá ®îc khai b¸o: int x, *px; PhÐp to¸n mét ng«i & cho ®Þa chØ cña ®èi tîng cho nªn c©u lÖnh px = &x; sÏ g¸n ®Þa chØ cña x cho biÕn px; px b©y giê ®îc gäi lµ “trá tíi” x. PhÐp to¸n & chØ ¸p dông ®îc cho c¸c biÕn vµ phÇn tö m¶ng; kÕt cÊu kiÓu &(x + 1) vµ &3 lµ kh«ng hîp lÖ. PhÐp to¸n mét ng«i * coi ®èi tîng cña nã lµ ®Þa chØ cÇn xÐt vµ th©m nhËp tíi ®Þa chØ ®ã ®Ó lÊy ra néi dung cña biÕn. VÝ dô, nÕu y lµ int th× y = *px; sÏ g¸n cho y néi dung cña biÕn mµ px trá tíi. VËy d·y px= &x; y = *px; sÏ g¸n gi¸ trÞ cña x cho y nh trong lÖnh y = x; Còng cÇn ph¶i khai b¸o cho c¸c biÕn tham dù vµo viÖc nµy: int x, y; int *px; Khai b¸o cña x vµ y lµ ®iÒu ta ®· biÕt. Khai b¸o cña con trá px cã ®iÓm míi int *px; cã ngô ý r»ng tæ hîp *px cã kiÓu int. Con trá cã thÓ xuÊt hiÖn trong c¸c biÓu thøc. Ch¼ng h¹n, nÕu px trá tíi sè nguyªn x th× *px cã thÓ xuÊt hiÖn trong bÊt k× ng÷ c¶nh nµo mµ x cã thÓ xuÊt hiÖn y = *px + 1; sÏ ®Æt y lín h¬n x 1 ®¬n vÞ; printf(“%d \ n”,*px); in ra gi¸ trÞ hiÖn t¹i cña x. 53
  20. phÐp to¸n mét ng«i * vµ & cã møc u tiªn cao h¬n c¸c phÐp to¸n sè häc, cho nªn biÓu thøc nµy lÊy bÊt k× gi¸ trÞ nµo mµ px trá tíi, céng víi 1 råi g¸n cho y. Con trá còng cã thÓ xuÊt hiÖn bªn vÕ tr¸i cña phÐp g¸n. NÕu px trá tíi x th× *px = 0; sÏ ®Æt x thµnh kh«ng vµ *px += 1; sÏ t¨ng x lªn nh trong trêng hîp (*px) + +; C¸c dÊu ngoÆc lµ cÇn thiÕt trong vÝ dô cuèi; nÕu kh«ng cã chóng th× biÓu thøc sÏ t¨ng px thay cho viÖc t¨ng ë chç nã trá tíi, bëi v× phÐp to¸n mét ng«i nh * vµ + + ®îc tÝnh tõ ph¶i sang tr¸i. Cuèi cïng, v× con trá lµ biÕn nªn ta cã thÓ thao t¸c chóng nh ®èi víi c¸c biÕn kh¸c. NÕu py lµ con trá n÷a kiÓu int, th×: py = px; sÏ sao néi dung cña px vµo py, nghÜa lµ lµm cho py trá tíi n¬i mµ px trá. VÝ dô sau minh häa nh÷ng thao t¸c truy nhËp gi¸n tiÕp tíi biÕn th«ng qua con trá. VÝ dô 2.10. Thay ®æi néi dung cña hai biÕn a vµ b th«ng qua con trá. #include #include #include #include #include #include void main(void){ int a = 5, b = 7; /* gi¶ sö cã hai biÕn nguyªn a =5, b = 7*/ int *px, *py; /* khai b¸o hai con trá kiÓu int */ px = &a; /* px trá tíi x */ printf(“\n Néi dung con trá px =%d”, *px); *px = *px + 10; /* Néi dung cña *px lµ 15*/ /* con trá px ®· thay ®æi néi dung cña a */ printf(“\n Gi¸ trÞ cña a = %d”, a); px = &b; /* px trá tíi b */ py = px; /* con trá py thay ®æi gi¸ trÞ cña b th«ng qua con trá px*/ *py = *py + 10; printf(“\n Gi¸ trÞ cña b=%d”, b); 54
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2