intTypePromotion=1

Bài giảng Cơ sở lập trình: Phần 2 – ĐH CNTT&TT

Chia sẻ: Kiếp Này Bình Yên | Ngày: | Loại File: PDF | Số trang:70

0
54
lượt xem
3
download

Bài giảng Cơ sở lập trình: Phần 2 – ĐH CNTT&TT

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Phần 2 của bài giảng "Cơ sở lập trình" tiếp tục cung cấp cho người học những kiến thức cơ sở lập trình ngôn ngữ C. Trong phần này chúng ta sẽ cùng tìm hiểu về: Con trỏ, liên hệ giữa con trỏ và mảng, kiểu cấu trúc, hàm và chương trình con, các thao tác trên file văn bản, lập trình trong kinh tế. Mời các bạn cùng tham khảo.

Chủ đề:
Lưu

Nội dung Text: Bài giảng Cơ sở lập trình: Phần 2 – ĐH CNTT&TT

  1. "e>dit an address", "d>isplay an address" }; static char tieude[40]="main menu\n\n"; thucdon(tieude,chon,3); getch(); return 0; } void thucdon(char *tieude,char *lua[],int kichthuoc) { int i; printf(tieude); for (i=0;i
  2. ví dụ: int *p; tên biến trỏ chỉ rằng đây là biến trỏ kiểu biến được trỏ *p là dữ liệu được chứa trong địa chỉ là p. Nói cách khác p là vùng nhớ chứa địa chỉ của *p. Hay p là con trỏ trỏ tới biến chứa giá trị *p. Khi ta khai báo một biến con trỏ, máy sẽ cấp phát một vùng bộ nhớ là 2 byte hoặc 4 byte tuỳ theo kiểu của biến được trỏ. Ví dụ: khai báo int *p; thì máy sẽ cấp phát một vùng nhớ 2 byte liên tiếp cho biến trỏ p. Khai báo float x=90.8; - máy sẽ cấp phát một vùng nhớ là 4 byte liên tiếp cho biến x. Con trỏ và địa chỉ của biến Địa chỉ của biến là số thứ tự của byte đầu tiên được cấp phát trong dãy các byte cấp phát cho biến (các byte được đánh số từ 0) Như đã trình bày trên, con trỏ là một biến gồm một nhóm các ô nhớ (2 hoặc 4 byte) để lưu trữ các địa chỉ. Phép toán một ngôi & xác định địa chỉ của đối tượng mà con trỏ trỏ tới. Phép toán một ngôi * sử dụng với biến trỏ để xác định giá trị ở địa chỉ mà con trỏ trỏ tới. Ví dụ: giả sử ta khai báo các biến x, p và phép gán như sau: int x=12; // x là biến có giá trị bằng 15 int *p; // con trỏ p trỏ tới dữ liệu kiểu số nguyên p=&x; // p nhận giá trị địa chỉ của x. Đầu tiên biến trỏ p chứa có một giá trị xác định, sau khi có phép gán p=&x; thì biến p chứa địa chỉ của ô nhớ x, và tất nhiên nó cũng chứa địa chỉ của bản thân nó. Khi biến trỏ không chứa bất kì một địa chỉ nào thì giá trị của nó là null. Cách dùng con trỏ Ta có thể sử dụng tên con trỏ hoặc khai báo của nó trong các biểu thức. Không nhập giá trị cho con trỏ từ bàn phím. Quy cách in con trỏ và địa chỉ là: *p 65
  3. + Sử dụng tên con trỏ: con trỏ cũng là một biến nên có thể dùng trong biểu thức vì giá trị của nó sẽ được dùng trong biểu thức này (nhưng chú ý rằng giá trị của con trỏ là địa chỉ của biến nào đó). Khi tên con trỏ đứng ở vế trái của biểu thức gán thì vế phải (phải là địa chỉ của biến) được gán cho con trỏ. Ví dụ: float a, *p, *q; // khai báo a là một số thực, p và q là hai con trỏ p=&a; // địa chỉ của biến a được gán cho con trỏ p q=p; // giá trị của con trỏ p được gán cho con trỏ q Cũng như các biến khác, nội dung của con trỏ có thể được thay đổi và ta có thể sử dụng quy tắc này để biến đổi địa chỉ. Sử dụng dạng khai báo của con trỏ giả sử ta có các khai báo int x,y,z,*px,*py; px=&x; py=&y; Thì con trỏ px trỏ tới x (hay còn nói px chứa địa chỉ của x) và con trỏ py trỏ tới y (py chứa địa chỉ của y). Khi đó ta có các cách viết x và *px là như nhau, nghĩa là *px=x; *py=y *px, *py là giá trị mà con trỏ px, py trỏ tới ví dụ: kiểm định các giá trị của con trỏ #include #include void main() { clrscr(); int so; int *contro; so=10; printf(“\ndia chi cua so:%p “,&so); printf(“\ngia tri cua so:%d “,so); contro=&so; 66
  4. printf(“\ndia chi cua con tro:%p “,&contro); printf(“\ngia tri cua con tro:%p “,contro); printf(“\ng_tri duoc con tro tro toi:%d “,*contro); getch(); return; } Giả sử địa chỉ của biến so là fff4 và địa chỉ của contro là fff2, khi đó chương trình sẽ cho kết quả là: dia chi cua so: fff4 gia tri cua so: 10 dia chi cua con tro: fff2 gia tri cua con tro: fff4 gia tri duoc con tro tro toi: 10 2.5.3. Các phép toán trên con trỏ Phép toán một ngôi & xác định địa chỉ của đối tượng mà con trỏ trỏ tới. Phép toán một ngôi * sử dụng với biến trỏ để xác định giá trị ở địa chỉ mà con trỏ trỏ tới. Các phép toán số học: Phép cộng một con trỏ với một số nguyên được một con trỏ có cùng kiểu Phép trừ một con trỏ với một số nguyên được một con trỏ có cùng kiểu Phép trừ hai con trỏ có cùng kiểu sẽ được một số nguyên giả sử ta có khai báo: int *p, i=5; thế thì: - phép ++p là: tăng giá trị của p lên một đơn vị - phép --p là: giảm giá trị của p một đơn vị Đơn vị tăng hay giảm của một con trỏ luôn luôn có kích thước của biến được trỏ vào. Nếu giá trị của biến được trỏ vào thuộc kiểu int thì một đơn vị tăng giảm là 2 byte. Nếu giá trị của biến được trỏ vào thuộc kiểu float thì một đơn vị tăng giảm là 4 byte ... . 67
  5. Các phép giữa các biến con trỏ: Phép gán: = Các phép so sánh: = (bằng nhau), != (khác nhau) Lưu ý: Phép toán & chỉ thực hiện cho các đối tượng trong bộ nhớ, nghĩa là chỉ thực hiện đối với các biến và các phần tử của mảng (mà thực chất là các biến có cùng tên), không được sử dụng được với các hằng, biểu thức và các biến thanh ghi. Nếu p là con trỏ trỏ tới một biến nguyên a thì p có thể xuất hiện trong các biểu thức, các câu lệnh giống như x. Ví dụ: *p=10+ ++*p; Con trỏ kiểu tổng quát: Con trỏ kiểu tổng quát là con trỏ có thể trỏ tới mọi kiểu con trỏ, nhưng ngược lại thì không được mà phải dùng phép ép kiểu. Con trỏ kiểu tổng quát là con trỏ khai báo kiểu void. Các phép tăng, giảm địa chỉ và phép so sánh không dùng với con trỏ tổng quát. ví dụ: void *tongquat; int *nguyen; char *kitu; tongquat = nguyen; //phộp gỏn hợp lệ *nguyen = *tongquat; //khụng hợp lệ kitu = (char)tongquat; //sử dụng đúng phép ép kiểu 2.5.4. Con trỏ và xâu ký tự Về thực chất xâu ký tự chính là một mảng có các phần tử là các ký tự, do vậy việc mối quan hệ giữa xâu ký tự và con trỏ chính là mối quan hệ giữa mảng một chiều với con trỏ, và điều này ta đã nghiên cứu ở phần trước. Tên xâu ký tự là một hằng địa chỉ biểu thị địa chỉ phần tử đầu của mảng chứa xâu ký tự đó. Khai báo char *tên; Ví dụ: 68
  6. char *thong_bao; Thì phép gán : thong_bao=”tam dung chuong trinh” Là hoàn toàn có nghĩa. Lúc này con trỏ thong_bao sẽ chứa địa chỉ đầu của mảng kiểu char đang chứa xâu ký tự “tam dung chuong trinh”. Khi đó câu lệnh puts(“tam dung chuong trinh”); hoàn toàn như lệnh puts(thong_bao) vì đều có tác dụng đưa ra màn hình dòng chữ: Tam dung chuong trinh Cần phân biệt giữa mảng kiểu char và con trỏ kiểu char Nếu ta có khai báo: char *tb,mang[15]; thì các câu lệnh sau là đúng tb=”chao cac ban”; (1) gets(mang); (2) còn các câu lệnh sau không thực hiện được mang=”chao cac ban”; (3) gets(tb); (4) Câu lệnh (3) không thực hiện được bởi vì tên mảng là một hằng địa chỉ, do vậy ta không thể gán cho nó một hằng địa chỉ khác. Câu lệnh (4) chưa thực hiện được bởi tb là con trỏ, nên trước khi sử dụng nó cần phải khởi tạo cho nó một giá trị nhất định, vì vậy muốn thực hiện dược câu lệnh này thì cần phải cho con trỏ tb trỏ tới một vùng nhớ xác định. Sau đây là một ví dụ về xử lý xâu ký tự với con trỏ. Ví dụ: Nhập và một xâu ký tự, đưa ra màn hình mã ASCII của các ký tự đã gõ vào. Công việc kết thúc khi nhập và xâu “ket thuc” #include #include #include void main(){ clrscr(); char *p; //con tro kieu ky tu char s[80]; do { 69
  7. p=s; gets(s); while (*p) printf("%10d",*p++); } while (strcmp(s,"ket thuc")); getch(); return; } 2.6. Liên hệ giữa con trỏ và mảng Con trỏ và mảng có mối quan hệ chặt chẽ vì vậy các con trỏ thường được sử dụng khi xử lý các mảng. 2.6.1. Con trỏ và mảng một chiều Phép toán lấy địa chỉ áp dụng được cho các phần tử của mảng một chiều Với khai báo: int x[50]; khi đó phép toán &x[i] cho địa chỉ của phần tử x[i] với i nằm trong khoảng từ 0 đến 49. Tên mảng là một hằng địa chỉ với khai báo trên về thực chất x là địa chỉ phần tử đầu tiên của mảng, nghĩa là x tương đương với &x[0] và x+i tương đương với &x[i], *(x+i) tương đương với x[i]. Tuy nhiên cần lưu ý rằng chỉ có tên mảng mới mang giá trị địa chỉ tức là con trỏ, còn khi viết tên mảng kèm theo dấu ngoặc vuông có chỉ số thì đó là một biến bình thường. Nghĩa là với khai báo trên thì x hoặc x[] là con trỏ, còn x[0], x[1], ... Lại là các giá trị biến. Nếu p là con trỏ trỏ tới một phần tử x[k] nào đó thì: p+i trỏ tới phần tử x[k+i] p-i trỏ tới phần tử x[k-i] *(p+i) tương đương với x[k+i] xét ví dụ sau: #include #include void main(){ clrscr(); int a[10],*pa,x; a[0]=11; a[1]=22;a[3]=33;a[4]=44; 70
  8. pa=&a[0]; x=*pa; pa++; x=*pa; x=*pa+1; x=*(pa+1); x=*++pa; x=*pa++; x=++*pa; getch(); return; } 2.6.2. Con trỏ và mảng hai chiều Như đã biết các phần tử của mảng hai chiều sau khi khai báo được sắp xếp trong bộ nhớ với các địa chỉ liên tiếp liền nhau theo thứ tự trên một hàng. ví dụ: Với khai báo : float a[2][3]; Thì các phần tử của mảng a được sắp xếp như sau phần tử a[0][0], a[0][1], a[0][2], a[1][0], a[1][1], a[1][2] địa chỉ 1 2 3 4 5 6 Ta cũng đã biết mảng hai chiều là mảng của mảng một chiều và tên biến mảng biểu thị địa chỉ của phần tử đầu tiên của mảng, nên với khai báo trên ta có a là một mảng mà mỗi phần tử của nó gồm 3 số thực (một hàng của bảng), trong đó: a trỏ tới phần tử đầu tiên của hàng đầu là a[0][0] a + 1 trỏ tới phần tử đầu tiên của hàng thứ hai là a[1][0]. Để lần lượt duyệt trên các phần tử của mảng hai chiều, ta vẫn có thể dùng con trỏ theo cách sau: float *p,a[2][3]; p= (float*)a; Khi đó : p trỏ tới a[0][0] p+1 trỏ tới a[0][1] 71
  9. p+2 trỏ tới a[0][2] p+3 trỏ tới a[1][0] p+4 trỏ tới a[1][1] p+5 trỏ tới a[1][2] Ví dụ: để nhập dữ liệu cho một mảng hai chiều với các phần tử của mảng thuộc kiểu float ta thực hiện như sau: #include #include void main(){ clrscr(); float a[2][3],*p; int i; p=(float*)a; //nhap mang for (i=0;i
  10. clrscr(); float a[50][50]; int i,j,m,n; printf("so dong:"); scanf("%d",&m); printf("\nso cot:"); scanf("%d",&n); //nhap mang for (i=0;i
  11. int i,j,m,n; printf("so dong:"); scanf("%d",&m); printf("\nso cot:"); scanf("%d",&n); //nhap mang for (i=0;i
  12. ví dụ: khai báo double * x [50]; số phần tử tên mảng để chỉ mảng con trỏ kiểu của phần tử được trỏ tới Cách dùng Khi sử dụng mảng con trỏ cần phải gán cho mỗi phần tử của mảng một giá trị, giá trị này phải là địa chỉ của một biến hoặc của một phần tử mảng. Các phần tử của mảng con trỏ kiểu char có thể khởi đầu bằng các xâu ký tự. Bản thân con trỏ không thể dùng để lưu trữ số liệu, nhưng mảng con trỏ cho phép sử dụng các mảng khác để lưu trữ số liệu một cách có hiệu quả hơn theo cách: chia mảng thành các thành phần và ghi nhớ địa chỉ đầu của mỗi phần vào một phần tử của mảng con trỏ. ví dụ: #include #include #include void tim_ng(int ma){ static char *ds[]={ "ma sai", "ten a", "ten binh", "ten minh", "ten xau", "tan ", "chung", "hoa", "dung", "khoa", "hfvjk" }; 75
  13. printf("\n\n ma:%d",ma); printf("\n%s\n",(ma10)?ds[0]:ds[ma]); } void main(){ int i; tt:printf("can tim nguoi thu: "); scanf("%d",&i); tim_ng(i); printf("co tiep tuc khong? "); if (toupper(getch())=='c') goto tt; getch(); return; } 2.6.5. Cấp phát động con trỏ 2.6.5.1. Biến động Tất cả các biến có kiểu dữ liệu mà ta đã nghiên cứu như mảng, int float,... Được gọi là tĩnh vì chúng được khai báo trước một cách rõ ràng lúc mô tả kiểu và khai báo biến, sau đó chúng được sử dụng thông qua tên của chúng. Thời gian tồn tại của biến cũng là thời gian tồn tại của khối chương trình chứa có chứa khai báo biến này. Ví dụ các biến tĩnh được mô tả và khai báo trong chương trình chính sẽ tồn tại trong suốt thời gian chương trình chạy, còn các biến tĩnh được mô tả và khai báo trong một hàm sẽ tồn tại mỗi khi hàm được gọi. Các biến động (dynamic) là các biến tạo ra trong lúc chạy chương trình tuỳ theo nhu cầu. số các biến động hoàn toàn không xác định được từ trước. Các biến động không có tên (vì việc đặt tên thực chất là gán cho nó một địa chỉ xác định). Việc truy nhập các biến động được thực hiện nhờ các biến con trỏ, các biến con trỏ được định nghĩa như là các biến tĩnh (nghĩa là có tên và được khai báo ngay từ đầu) được dùng để chứa địa chỉ các biến động. Các hàm xử lý với con trỏ Hàm malloc Cú pháp khái báo 76
  14. void *malloc(size_t size); Hàm malloc dùng để xin cấp phát một vùng bộ nhớ có kích thước size bytes từ vùng nhớ heap. Hàm này cho phép một chương trình xin cấp phát một vùng bộ nhớ đúng với kích thước mà chương trình cần. Giá trị trả về Trong trường hợp cấp phát thành công, hàm malloc trả về một con trỏ tới khối nhớ mới được cung cấp. Trong trường hợp có lỗi (không đủ bộ nhớ để cấp phát, malloc trả về giá trị null). Nếu tham số size=0, malloc trả về con trỏ null. Hãy xem đoạn code sau đây: #include #include #include #include main(){ char str; char *s; /* cap phat bo nho */ if ((str == (char ) malloc(10)) ==null) { printf(" khong du bo nho "); exit(1); } /* ket thuc chuong trinh cap phat bo nho /* sao chep o chao ban vao xau*/ strcpy(s,"chao ban"); /*hien xau*/ printf("xau la %s", s); /* giai phong bo nho*/ free(s); } Hàm calloc Cú pháp khai báo void *calloc(size*nitems, size_t size); 77
  15. Hàm calloc xin cấp phát một vùng nhớ kích thước (nitems*size) bytes và xóa trắng vùng nhớ này. muốn xin cấp phát vùng nhớ có kích thước lớn hơn 64k, phải sử dụng hàm farcalloc() (cấp phát xa). Giá trị trả về Trong trường hợp thành công, calloc trả về con trỏ tới vùng nhớ mới được cấp phát. Khi có lỗi cấp phát (không đủ bộ nhớ hoặc một trong hai tham số nitems hoặc size bằng 0) thì hàm trả về null. ví dụ #include #include #include int main(void) { char *str = null; /* dia chi chuoi trong bo nho */ str = (char *) calloc(10, sizeof(char)); /* copy "hello" vao chuoi str */ strcpy(str, "hello"); /* hien thi chuoi */ printf("string is %s\n", str); /* giai phong bo nho */ free(str); return 0; } Hàm farrealloc, realloc Cú pháp khai báo void *realloc(void *khốidl, size_t size); void far *farrealloc(void far *oldblock, unsigned long nbytes); Hàm farrealloc chỉnh lại kích thước của khối nhớ block thành nbytes, sao chép nội dung của vùng nhớ cũ vào vùng nhớ mới nếu vùng nhớ mới được cấp phát lại không cùng địa chỉ với vùng trước cấp phát. 78
  16. Hàm realloc điều chỉnh lại kích thước của khối nhớ block thành size, sao chép nội dung vùng nhớ cũ vào vùng mới nếu thấy cần thiết. Tham số Chức năng block trỏ đến một vùng nhớ đã được cấp phát trước đó bằng cách gọi hàm malloc, calloc, hoặc realloc. Nếu block bằng null, realloc làm việc giống như malloc. oldblock trỏ đến vùng nhớ đã được cấp phát từ trước bằng cách gọi hàm farmalloc, farcalloc, hoặc farrealloc nbytes. size kích thước mới của vùng nhớ được trỏ bởi block nbyte kích thước mới của vùng nhớ được trỏ bởi old_block Bộ nhớ heap và cơ chế tạo biến động Các biến động tạo ra được C xếp vào một vùng ô nhớ tự do theo kiểu xếp chồng được gọi là heap (bộ nhớ cấp phát động). Ngôn ngữ C quản lý bộ nhớ heap thông qua một con trỏ của heap gọi là heapptr. Con trỏ heap luôn luôn trỏ vào ô nhớ đầu tiên còn tự do của vùng nhớ tự do của heap. mỗi lần gọi hàm malloc() con trỏ lại được dịch chuyển về phía đỉnh của vùng nhớ tự do một số byte tương ứng với kích thước của biến động được tạo ra. Ngược lại mỗi khi giải phóng bộ nhớ biến động, bộ nhớ biến động được thu hồi. Tuy nhiên việc thu hồi và tạo ra không phải là quá trình liên tục và kế cận thì bản thân bộ nhớ heap cũng bị chia nát ra 79
  17. địa chỉ cao con trỏ của heap bộ nhớ heap còn tự do địa chỉ gốc của heap bộ nhớ heap đã được cấp phát cho biến động overlay buffer sseg : 0000 stack segment đã dùng sseg:ptr con trỏ của stack stack segment chưa dùng bộ nhớ chương địa chỉ thấp trình và các biến tĩnh Hình ảnh khái quát về việc sử dụng bộ nhớ heap. ví dụ: tìm số các nguyên tố với số lượng các số được nhập từ bàn phím. #include #include #include main(){ clrscr(); long *nguyento=null,*batdau=null,*mo=null,thu=0; int i=0,timthay=0,tong=0; printf("bao nhieu so ban can tim? "); scanf("%d",&tong); nguyento=(long*)malloc(tong*sizeof(long)); if (nguyento==null) 80
  18. { printf("\nkhong du bo nho!"); return 0; } *nguyento=2; *(nguyento+1)=3; *(nguyento+2)=5; mo=nguyento+3; thu=5; do { thu+=2; batdau=nguyento; timthay=0; for (i=0;i
  19. Ghi nhớ C là một danh sách các giá trị trong mảng. một mảng là một nhóm các phần tử có cùng kiểu giá trị được lưu trữ kế tiếp nhau trong bộ nhớ. Truy nhập đến các thành phần mảng bằng tên biến mảng và chỉ số. Chỉ số các phần tử tính từ 0. Chỉ số của phần tử mảng có thể là giá trị của một biến nguyên, một hằng nguyên hay một biểu thức cho giá trị nguyên. Một mảng ký tự có thể được sử dụng để lưu trữ xâu ký tự. xâu ký tự là một mảng ký tự đặc biệt có chứa ký tự ‘\0’ ở cuối xâu. Các thành phần của mảng có thể được khởi tạo theo 3 cách cùng với khai báo, bằng các câu lệnh gán, bằng câu câu lệnh nhập dữ liệu. C không tự động kiểm tra sự quá giới hạn kích thước của mảng. một xâu có thể đươc nhập bằng scanf() với mô tả %s hoặc bằng gets(), và có thể được hiển thị bởi hàm printf() với mô tả %s hoặc puts(). Con trỏ là biến chứa địa chỉ của các biến khác. Các con trỏ cần phải được khai báo trước khi sử dụng. Tương ứng với các kiểu dữ liệu khác nhau, có các loại biến con trỏ khác nhau. Có ba giá trị có thể sử dụng để khởi tạo cho một biến con trỏ: 0, null, hoặc một địa chỉ. Khởi tạo một con trỏ bằng 0 đồng nghĩa với khởi tạo null cho con trỏ. Chỉ có một số nguyên có thể gán được cho con trỏ đó là 0. Toán tử & trả về địa chỉ của toán hạng của nó. Toán hạng ở đây là một biến nào đó và không phải là biến kiểu thanh ghi (register). Toán tử * tham chiếu nội dung của một của đối tượng mà toán hạng của * trỏ tới trong bộ nhớ. Các thao tác số học có thể thực hiện trên con trỏ là ++ , -- ( trên các con trỏ ) , + , -, += , -= (giữa con trỏ và một số nguyên ). Khi một số nguyên được thêm vào hay trừ vào một con trỏ con trỏ được tăng hoặc giảm số nguyên đó lần kích thước của đối tượng được trỏ tới Các thao tác số học trên con trỏ chỉ được thực hiện trên một phần bộ nhớ liên tục chẳng hạn như một mảng. Khi thực hiện các thao tác số học con trỏ trên mảng ký tự kết quả thu được giống như đối với các thao tác số học thông thường bởi vì mỗi một ký tự được lưu trữ một byte trong bộ nhớ. Có thể gán giá trị của một con trỏ cho một con trỏ khác cùng kiểu. 82
  20. Một con trỏ void không áp dụng được phép toán *. Các con trỏ có thể được so sánh với nhau theo các toán tử so sánh. ý nghĩa của các phép so sánh giống như các phép so sánh thông thường. Một con trỏ có thể được đánh chỉ số như mảng. Tên mảng là một hằng con trỏ chỉ phần tử đầu tiên của mảng (thứ tự 0). Độ lệch con trỏ có cùng khái niệm như chỉ số đối với mảng. Có thể khai báo một mảng các con trỏ. Các lỗi hay gặp khi lập trình Truy nhập tới một phần tử nằm ngoài giới hạn của mảng. Truy nhập tới các phần tử của mảng nhiều chiều sai quy cách, chẳng hạn a[2,4] thay vì a[2][4]. Nhầm lẫn giữa “phần tử thứ bảy của mảng” và “phần tử mảng có số thứ tự 7”. Quên toán tử * trong khai báo các biến con trỏ. mỗi biến con trỏ cần phải được khai báo với một * như phần tiền tố. Tham chiếu tới một con trỏ chưa được khởi tạo giá trị. Điều này có thể gây ra lỗi thực hiện chương trình. Sử dụng các thao tác số học con trỏ trên một con trỏ không có liên hệ với một mảng cụ thể nào đó. Dùng toán tử * để lấy nội dung của một con trỏ void. Sử dụng tên mảng trong các phép toán nhằm thay đổi giá trị của tên đó. sai vì tên mảng là một hằng con trỏ. Các thói quen lập trình tốt cần học tập Khi duyệt qua các thành phần của một mảng, chỉ số không được bé hơn 0 và phải bé hơn kích thước của mảng. Thêm ptr ở phần đầu tên của các con trỏ để phân biệt với các biến thông thường khác. Sử dụng ký pháp mảng khi thao tác trên mảng thay vì ký pháp con trỏ. 2.7. Kiểu cấu trúc 2.7.1. Khái niệm và định nghĩa cấu trúc Trong thực tế lập trình, chúng ta có thể sẽ cần đến những kiểu dữ liệu phức tạp hơn được tạo thành từ những kiểu dữ liệu đơn giản mà chúng ta đã biết. những kiểu dữ liệu này cho ta một khả năng kết hợp một nhóm các biến cùng thể hiện một 83
ADSENSE
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

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