37
CHƯƠNG 5 CHƯƠNG 5 CON TRCON TR(Pointers) (Pointers) (Pointers) (Pointers)

CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

CHƯƠNG 5CHƯƠNG 5CON TRỎCON TRỎ(Pointers)(Pointers)(Pointers)(Pointers)

Page 2: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

1. Giới thiệu1. Giới thiệu1. Giới thiệu1. Giới thiệu

Một con trỏ là 1 biến chứa một địa chỉ bộnhớ. Địa chỉ này là vị trí của một đối tượngkhác trong bộ nhớ.

Nếu một biến chứa địa chỉ của một biến khác,biến thứ nhất được gọi là trỏ đến biến thứ hai.

Page 3: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

1. Giới thiệu1. Giới thiệu1. Giới thiệu1. Giới thiệu

Địa chỉ Biến trongị

bộ nhớ bộ nhớ Một biến được cấp phát ônhớ tại địa chỉ 1000 cógiá trị là địa chỉ (1003)giá trị là địa chỉ (1003)của 1 biến khác. Biến thứnhất được gọi là con trỏ.

Bộ nhớ

Page 4: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

2. Khai báo bi2. Khai báo biếến con trn con trỏỏ2. Khai báo bi2. Khai báo biếến con trn con trỏỏ

Cú pháp:

type *pointerVariable;

type: xác định kiểu dữ liệu của biến màtype: xác định kiểu dữ liệu của biến mà con trỏ trỏ đến.

Ví dụ:Ví dụ:int *a;

a

Page 5: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

3. Toán t3. Toán tửử con trcon trỏỏ ((pointer operatorspointer operators))((p pp p ))

Toán tử & là toán tử 1 ngôi, trả về địa chỉ bộ nhớ của toán hạng của nó.

◦ Toán tử & dùng để gán địa chỉ của biến cho biến con trỏ

Cú pháp: p p

<Tên biến con trỏ>=&<Tên biến>

Page 6: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

3. Toán t3. Toán tửử con trcon trỏỏ ((pointer operatorspointer operators))3. Toán t3. Toán tửử con trcon trỏỏ ((pointer operatorspointer operators))

Ví dụ: a 25 x25a 25 xy

25int a=25, x;int *y;

yx=a;y=&a;

y

Page 7: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

3. Toán t3. Toán tửử con trcon trỏỏ ((pointer operatorspointer operators))3. Toán t3. Toán tửử con trcon trỏỏ ((pointer operatorspointer operators))

Toán tử * : là toán tử một ngôi trả về giá trị tại địa chỉ con trỏ trỏ đến.Cú pháp:

*<Tên biến con trỏ> Ví dụ: a=*p ;ụ p ;

Page 8: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

4. Các thao tác trên con trỏ4. Các thao tác trên con trỏ4. Các thao tác trên con trỏ4. Các thao tác trên con trỏ

Lệnh gán con trỏCó thể dùng phép gán để gán giá trị của mộtcon trỏ cho một con trỏ khác có cùng kiểuVí dụ:

int x;int *p1, *p2;p1 = &x;p2 = p1;

Sau khi đọan lệnh trên được thực hiện, cả ọ ệ ợ ự ệ ,hai p1 và p2 cùng trỏ đến biến x.

Page 9: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

4. Các thao tác trên con trỏ4. Các thao tác trên con trỏ4. Các thao tác trên con trỏ4. Các thao tác trên con trỏ

Phép toán số học trên con trỏ◦ Chỉ có 2 phép toán sử dụng trên con trỏ là

phép cộng và trừ

◦ Khi cộng (+) hoặc trừ (-) 1 con trỏ với 1 sốnguyên N; kết quả trả về là 1 con trỏ. Cong y ; qtrỏ này chỉ đến vùng nhớ cách vùng nhớ củacon trỏ hiện tại một số nguyên lần kíchthướ ủ kiể dữ liệ ủ óthước của kiểu dữ liệu của nó.

Page 10: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

4. Các thao tác trên con trỏ4. Các thao tác trên con trỏ4. Các thao tác trên con trỏ4. Các thao tác trên con trỏ

Ví dụ :char *a;short *b;long *c;

Các con trỏ a, b, c lần lượt trỏ tới ô nhớ 1000 2000 à 30001000, 2000 và 3000.

Cộng các con trỏ với một số nguyên:1 // ỏ dời đi 1 ba = a + 1;//con trỏ a dời đi 1 byte

b = b + 1;//con trỏ b dời đi 2 byte c = c + 1; //con trỏ c dời đi 4 bytec = c + 1; //con trỏ c dời đi 4 byte

Page 11: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

4. Các thao tác trên con trỏ4. Các thao tác trên con trỏ4. Các thao tác trên con trỏ4. Các thao tác trên con trỏ

Page 12: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

4. Các thao tác trên con trỏ4. Các thao tác trên con trỏ4. Các thao tác trên con trỏ4. Các thao tác trên con trỏ

Lưu ý: cả hai toán tử tăng (++) và giảm (--)đều có quyền ưu tiên lớn hơn toán tử *

Ví dụ: *p++;

Lệnh *p++ tương đương với *(p++) : thựchiện là tăng p (địa chỉ ô nhớ mà nó trỏ tớihiện là tăng p (địa chỉ ô nhớ mà nó trỏ tớichứ không phải là giá trị trỏ tới).

Page 13: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

4. Các thao tác trên con trỏ4. Các thao tác trên con trỏ4. Các thao tác trên con trỏ4. Các thao tác trên con trỏ

Ví dụ:*p++ = *q++;

Cả hai toán tử tăng (++) đều được thực hiện sau khi giá trị của *q được gán cho *p và sau đó cả q và p đều tăng lên 1. Lệnh này tương đươ ớiđương với:

*p = *q;p++;q++;

Page 14: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

4. Các thao tác trên con trỏ4. Các thao tác trên con trỏ4. Các thao tác trên con trỏ4. Các thao tác trên con trỏ#include <iostream.h>#include<conio h>#include<conio.h>void main (){

int a = 20, b = 15, *pa, *pb, temp;pa = &a; // con trỏ pa chứa địa chỉ của apb = &b; // con trỏ pb chứa địa chỉ của bpb &b; // con trỏ pb chứa địa chỉ của btemp = *pa;*pa = *pb;*pb temp;

// kết quả xuất ra à hì h*pb = temp;

cout << "a = " << a << endl;cout << “b = ” << b;

màn hìnha = 15b = 20

}b 20

Page 15: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

5. Cấp phát bộ nhớ động5. Cấp phát bộ nhớ động5. Cấp phát bộ nhớ động5. Cấp phát bộ nhớ động

Con trỏ cung cấp sự hổ trợ cho cấp phát bộnhớ động trong C/C++.Cấp phát động là phương tiện nhờ đó mộth ì h ó hể dà h đ hê bộ hớchương trình có thể dành được thêm bộ nhớ

trong khi đang thực thi, giải phóng bộ nhớ khikhông cần thiếtkhông cần thiếtC/C++ hổ trợ hai hệ thống cấp phát động:một hệ thống được định nghĩa bởi C và mộtmột hệ thống được định nghĩa bởi C và mộtđược định nghĩa bởi C++.

Page 16: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

5. Cấp phát bộ nhớ động5. Cấp phát bộ nhớ động5. Cấp phát bộ nhớ động5. Cấp phát bộ nhớ động

Cấp phát động được định nghĩa bởi C

−Vùng nhớ Heap được sử dụng cho việc cấpphát động các khối bộ nhớ trong thời gianthực thi chương trình. Gọi là bộ nhớ động.

−Hàm malloc() và free() dùng để cấp phát() () g p pvà thu hồi bộ nhớ, trong thư viện stdlib.h

Page 17: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

5. Cấp phát bộ nhớ động5. Cấp phát bộ nhớ động5. Cấp phát bộ nhớ động5. Cấp phát bộ nhớ động

Hàm malloc(): cấp phát bộ nhớ động. ủ hà ó d−Prototype của hàm có dạng

void *malloc(length)length: là số byte muốn cấp phát− length: là số byte muốn cấp phát.

− Hàm malloc() trả về một con trỏ có kiểuvoid, do đó có thể gán nó cho con trỏ có, gkiểu bất kỳ.−Sau khi cấp phát thành công, hàm malloc()

trả về địa chỉ của byte đầu tiên của vùngtrả về địa chỉ của byte đầu tiên của vùngnhớ được cấp phát từ heap. Nếu khôngthành công (không có đủ vùng nhớ rỗi yêug ( g g ycầu), hàm malloc() trả về null.

Page 18: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

5. Cấp phát bộ nhớ động5. Cấp phát bộ nhớ động5. Cấp phát bộ nhớ động5. Cấp phát bộ nhớ động

Ví dụ:char *p;p = (char *) malloc(1000); //cấp phát 1000

bytes

Vì hàm malloc() trả về con trỏ kiểu void, nên() ,phải ép kiểu (casting) nó thành con trỏ charcho phù hợp với biến con trỏ p.

Page 19: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

5. Cấp phát bộ nhớ động5. Cấp phát bộ nhớ động5. Cấp phát bộ nhớ động5. Cấp phát bộ nhớ động

Ví dụ:int *p;p = (int *) malloc(50*sizeof(int));p ( ) ( ( ))

Toán tử sizeof để xác định kích thước kiểudữ liệu int.ệ

Page 20: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

5. Cấp phát bộ nhớ động5. Cấp phát bộ nhớ động5. Cấp phát bộ nhớ động5. Cấp phát bộ nhớ động

Kích thước của heap không xác định nên khiểcấp phát bộ nhớ phải kiểm tra giá trị trả về

của hàm malloc() để biết là bộ nhớ có đượccấp phát thành công hay khôngcấp phát thành công hay không.Ví dụ:

p = (int *)malloc(100);p = (int *)malloc(100);if(p == NULL){{cout << "Khong du bo nho";exit(1);exit(1);

}

Page 21: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

5. Cấp phát bộ nhớ động5. Cấp phát bộ nhớ động5. Cấp phát bộ nhớ động5. Cấp phát bộ nhớ động

Hàm free(): Trả về vùng nhớ được cấp phát bởi hàm malloc().Cú pháp:

void free(void *p);p là con trỏ đến vùng nhớ đã được cấp phát trước đó bởi hàm malloc().

Page 22: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

5. Cấp phát bộ nhớ động5. Cấp phát bộ nhớ động5. Cấp phát bộ nhớ động5. Cấp phát bộ nhớ động

Cấp phát động được định nghĩa bởi C++

C++ cung cấp hai toán tử cấp phát bộ nhớđộng: new và delete.

−Toán tử new cấp phát bộ nhớ và trả vềmột con trỏ đến byte đầu tiên của vùng nhớộ y gđược cấp phát.

−Toán tử delete thu hồi vùng nhớ được cấpg ợ pphát trước đó bởi toán tử new.

Page 23: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

5. Cấp phát bộ nhớ động5. Cấp phát bộ nhớ động5. Cấp phát bộ nhớ động5. Cấp phát bộ nhớ động

Cú pháp:p = new type;delete p;p

p là một biến con trỏ nhận địa chỉ của vùngnhớ được cấp phát đủ lớn để chứa 1 đốiợ p ptượng có kiểu là type

Page 24: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

5. Cấp phát bộ nhớ động5. Cấp phát bộ nhớ động5. Cấp phát bộ nhớ động5. Cấp phát bộ nhớ độngVí dụ:

#incl de <iost eam h>#include <iostream.h>#include <new>int main()(){

int *p;i t // ll t f i tp = new int; // allocate space for an int

*p = 100;cout << "At " << p << " ";cout << At << p << ;cout << "is the value " << *p << "\n";delete p;

t 0return 0;}

Page 25: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

6. Con trỏ6. Con trỏ voidvoid ((void pointersvoid pointers))6. Con trỏ 6. Con trỏ voidvoid ((void pointersvoid pointers))

Con trỏ void là một lọai con trỏ đặc biệt màể ểcó thể trỏ đến bất kỳ kiểu dữ liệu nào.

Cú pháp:void *pointerVariable;

Ví dụ:void *p;p = &a; // p trỏ đến biến nguyên ap = &f; //p trỏ đến biến thực f

Page 26: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

6. Con trỏ6. Con trỏ voidvoid ((void pointersvoid pointers))6. Con trỏ 6. Con trỏ voidvoid ((void pointersvoid pointers))

Kiểu dữ liệu khi khai báo biến con trỏ chính làể ểkiểu dữ liệu của ô nhớ mà con trỏ có thể trỏ

đến.hỉ đặ à b ế ỏ hả ù k ể ớĐịa chỉ đặt vào biến con trỏ phải cùng kiểu với

kiểu của con trỏVí dVí dụ:

int a; float f;* fl * fint *pa; float *pf;

pa = &a; pf = &f;// hợp lệpa = &f; pf = &a; //không hợp lệ

Page 27: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

6. Con trỏ6. Con trỏ voidvoid ((void pointersvoid pointers))6. Con trỏ 6. Con trỏ voidvoid ((void pointersvoid pointers))

Tuy nhiên, ta cũng có thể ép kiểu con trỏ vềể ểđúng kiểu tương ứng khi dùng trong các biểu

thức.í dVí dụ:◦ Nếu p đang trỏ đến biến nguyên a, để tăng

iá t ị ủ biế lê 10 t hải dù lệ hgiá trị của biến a lên 10 ta phải dùng lệnh sau:

(int*)*p + 10;(int*)*p + 10;◦ Nếu p đang trỏ đến biến thực f, để tăng giá

trị của biến f lên 10 ta phải dủng lệnh sau:trị của biến f lên 10 ta phải dủng lệnh sau: (float*)*p + 10;

Page 28: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

7. Con trỏ null (7. Con trỏ null (Null pointersNull pointers))7. Con trỏ null (7. Con trỏ null (Null pointersNull pointers))

Một con trỏ hiện hành không trỏ đến một địachỉ bộ nhớ hợp lệ thì được gán giá trị NULLNULL được định nghĩa trong <cstdlib>

Ví dụ: #include <iostream.h>void main(){ int *p;

cout <<“Gia tri con tro p tro den la: “<< *p; }Kết quả của chương trình trên là:

NULL POINTER ASSIGNMENT

Page 29: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

8. Con trỏ và mảng8. Con trỏ và mảng8. Con trỏ và mảng8. Con trỏ và mảng

Giữa mảng và con trỏ có một sự liên hệ rấtchặt chẽ:

◦ Những phần tử của mảng được xác địnhbằng chỉ số trong mảng và cũng có thể đượcxác định qua biến con trỏ.

◦ Tên của một mảng tương đương với địa chỉphần tử đầu tiên của nó, tương tự một cont ỏ tươ đươ ới đị hỉ ủ hầ tử đầtrỏ tương đương với địa chỉ của phần tử đầutiên mà nó trỏ tới.

Page 30: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

8. Con trỏ và mảng8. Con trỏ và mảng8. Con trỏ và mảng8. Con trỏ và mảng

Ví dụ:char ch[10], *p;p = ch; p

Page 31: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

8. Con trỏ và mảng8. Con trỏ và mảng8. Con trỏ và mảng8. Con trỏ và mảng

p được gán địa chỉ của phần tử đầu tiên củamảng ch.

p = ch; Để tham chiếu phần tử thứ 3 trong mảng ch,ta dùng một trong 2 cách sau:

ch[2]

*(p+2).(p+2).

Page 32: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

8. Con trỏ và mảng8. Con trỏ và mảng8. Con trỏ và mảng8. Con trỏ và mảng

Truy cập các phần tử mảng bằng con trỏ

Kiểu mảng Kiểu con trỏ

&<Tên mảng>[0] <Tên con trỏ >

& Tê ả [ Vị t í ] Tê t ỏ Vị t í &<Tên mảng> [<Vị trí>] <Tên con trỏ> + <Vị trí>

<Tên mảng>[<Vị trí>] *(< Tên con trỏ > + <Vị trí>)

Page 33: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

8. Con trỏ và mảng8. Con trỏ và mảng8. Con trỏ và mảng8. Con trỏ và mảngVí dụ:#include <iostream h>#include <iostream.h>#include <conio.h>void main (){

int numbers[5], * p;p = numbers; *p = 10;p numbers; p 10;p++; *p = 20;p = &numbers[2]; *p = 30;p numbers + 3; *p 40;p = numbers + 3; *p = 40;p = numbers; *(p+4) = 50;for (int n=0; n<5; n++)cout << numbers[n] << ", ";

}

Page 34: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

8. Con trỏ và mảng8. Con trỏ và mảng8. Con trỏ và mảng8. Con trỏ và mảngNumbersint Numbers[5];

int *p;10 20 4030 50

p= Numbers;

int *p; p

*p = 10;

p20

p p p pp

p = 10;p++; *p = 20;p = &numbers[2]; *p = 30;p &numbers[2]; p 30;

p = numbers + 3; *p = 40;

p = numbers; *(p+4) = 50;p numbers; (p+4) = 50;

Page 35: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

8. Con trỏ và mảng8. Con trỏ và mảng8. Con trỏ và mảng8. Con trỏ và mảngVí dụ: Xuất mảng sử dụng con trỏ#include <iostream>#include <iostream>void main(){

int a[] = {0,1,2,3,4,5,6,7,8,9};int *p;p = a;p a;for(int i=0 ; i<10 ; i++){

*(p+i) *= 10; //tuong duong a[i] a[i]*10*(p+i) *= 10; //tuong duong a[i] = a[i]*10cout << “a[“ << i << “] = “ << *(p+i) << ”\n”;

}}

Page 36: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

9. Mảng con trỏ9. Mảng con trỏ9. Mảng con trỏ9. Mảng con trỏ

Mỗi biến con trỏ là một biến đơn. Ta có thểỗtạo mảng của các con trỏ với mỗi phần tử của

mảng là một con trỏ.ú háCú pháp:

type *pointerArray[elements];ể− type: kiểu dữ liệu mà các con trỏ phần tử

trỏ đến.i t A tê ả t ỏ− pointerArray: tên mảng con trỏ.

− elements: số phần tử của mảng con trỏ.

Page 37: CHƯƠNG 5 · 2009-08-24 · 4. Các thao tác trên con tr4. Các thao tác trên con trỏ yPhép toán số học trên con trỏ Chỉcó 2 phép toán sửdụng trên con trỏlà

9. Mảng con trỏ9. Mảng con trỏ9. Mảng con trỏ9. Mảng con trỏ

Ví dụ: P[0] P[1] P[2] P[3] P[4]

pint *p[5];int a=6;

100100

a 100p[0] = &a;

p[2] = p[0]; 66

int b;b

b = *p[0];p[ ];