Mảng và con trỏ

Một phần của tài liệu Bài giảng Xây dựng các hệ thống nhúng: Phần 2 (Trang 58 - 62)

3. The OS must be fast

3.5.9 Mảng và con trỏ

Mảng là một tập hợp cỏc dữ liệu cựng kiểu với độ dài cố định.. Mảng thường được khai bỏo với kiểu dữ liệu của mảng, tờn của mảng và số phần tử liờn quan được đặt trong mảng. Vớ dụ khai bỏo mảng sau:

char arr [5];

khai bỏo một mảng char với tờn ‘arr’ với khụng gian cho 5 phần tử char trong bộ nhớ như trong Hỡnh 3.23

Hỡnh 3.23: Minh họa mảng trong "C"

Phương thức đầu tiờn là khởi tạo toàn bộ mảng tại thời điểm khai bỏo mảng. Phương phỏp thứ hai là khởi tạo cú chọn lọc trong đú bất kỳ thành viờn nào cũng cú thể được khởi tạo hoặc thay đổi với một giỏ trị.

Hỡnh 3.24: Địa chỉ phần tử mảng và mối quan hệ nội dung

//Initialisation of array at the time of declaration unsigned char arr[5] = {5, 10, 20, 3, 2};

unsigned char arr[ ] = {5, 10, 20, 3, 2}; //Selective initialisation

197 arr[0] = 5; arr[0] = 5; arr[1] = 10; arr[2] = 20; arr[3] = 3; arr[4] = 2;

Con trỏ là một tớnh năng linh hoạt đồng thời là tớnh năng nguy hiểm nhất, cú khả năng tạo ra cỏc sự cố tiềm ẩn dẫn đến sự cố phần mềm, nếu khụng được sử dụng đỳng cỏch. Con trỏ là một kỹ thuật dựa trờn bộ nhớ để truy cập và sửa đổi biến. Con trỏ rất hữu ớch trong những trường hợp

- Truy cập và sửa đổi cỏc biến. - Tăng tốc độ thực hiện.

- Truy cập nội dung trong một khối bộ nhớ.

- Truyền biến cho cỏc hàm bằng cỏch loại bỏ việc sử dụng bản sao biến cục bộ.

- Cấp phỏt bộ nhớ động.

Để hiểu khỏi niệm con trỏ, chỳng ta hóy xem tổ chức bộ nhớ dữ liệu của bộ xử lý. Đối với bộ xử lý / bộ điều khiển cú RAM bờn trong cú thể lập trỡnh 128 byte (vớ dụ AT89C51), bộ nhớ được tổ chức dưới dạng

198

Hỡnh 3.26: Mối quan hệ giữa tờn biến, địa chỉ và dữ liệu được giữ bởi biến

Nội dung của vị trớ bộ nhớ 0x45 (đại diện cho đầu vào biến) cú thể được truy cập và sửa đổi bằng cỏch sử dụng một con trỏ cú cựng loại với biến (char cho đầu vào biến trong vớ dụ). Việc truy cập này được thực hiện bằng phương phỏp sau.

char input; //Declaring input as character variable

char *p; //Declaring a character pointer p (* denotes p is a pointer) p = &input //Assigns the address of input as content to p

Tương tự được biểu diễn bằng sơ đồ như:

Hỡnh 3.27: Kỹ thuật truy cập bộ nhớ dựa trờn con trỏ

Trỡnh biờn dịch gỏn một bộ nhớ cho biến con trỏ ký tự p. Đặt nú là 0x00 (Giỏ trị tựy ý được chọn để minh họa) và vị trớ bộ nhớ giữ địa chỉ bộ nhớ của đầu vào biến (0x45) làm nội dung. Tớnh năng con trỏ trong “C” giống như kỹ thuật đỏnh địa chỉ giỏn tiếp được sử dụng trong 8051. MOV R0, #45H

MOV A,@R0 ; R0 & R1 are the indirect addressing registers. là một vớ dụ cho việc sử dụng con trỏ bộ nhớ 8 bit trong 8051

199

MOV A,@DPTR ; DPTR is the 16bit indirect addressing register

là một vớ dụ cho hoạt động con trỏ bộ nhớ 16 bit. Hỡnh thức chung của việc khai bỏo một con trỏ trong ‘C’ là

data type *pointer; //’data type’ is the standard data type like //int, char, fl oat etc… supported by ‘C’ language.

Biểu tượng * (dấu hoa thị) thụng bỏo cho trỡnh biờn dịch rằng con trỏ biến là biến con trỏ. Giống như bất kỳ biến nào khỏc, con trỏ cũng cú thể được khởi tạo trong chớnh khai bỏo của nú.

E.g. char x, y; char *ptr = &x;

Nội dung được trỏ bởi một con trỏ được sửa đổi / truy xuất bằng cỏch sử dụng * làm tiền tố cho con trỏ.

E.g. char x=5, y=56;

char *ptr=&x; //ptr holds address of x *ptr = y; //x = y

Con trỏ: Toỏn tử số học và quan hệ trờn ngụn ngữ C

Bổ sung số nguyờn với con trỏ. Vớ dụ: ptr + 2 (cần lưu ý rằng con trỏ được chuyển tiếp theo chiều dài lưu trữ được trỡnh biờn dịch hỗ trợ cho kiểu dữ liệu của con trỏ nhõn với số nguyờn. Vớ dụ: đối với con trỏ nguyờn cú kớch thước lưu trữ của int = 4, phộp cộng ở trờn sẽ tăng con trỏ lờn 4 ì 2 = 8)

- Phộp trừ số nguyờn từ con trỏ, vớ dụ: ptr - 2 (quy tắc trờn được ỏp dụng)

- Hoạt động tăng dần của con trỏ, vớ dụ: ++ ptr và ptr ++ (tựy thuộc vào loại con trỏ, bối cảnh gia tăng ++ thay đổi). Đối với toỏn tử con trỏ ++, toỏn tử tăng con trỏ lờn 1 và đối với con trỏ nguyờn, con trỏ được tăng theo kớch thước lưu trữ của số nguyờn được trỡnh biờn dịch hỗ trợ (vớ dụ: con trỏ ++ dẫn đến con trỏ + 4 nếu kớch thước cho số nguyờn được hỗ trợ bởi trỡnh biờn dịch là 4)

- Hoạt động giảm dần của con trỏ, vớ dụ: - - ptr và ptr - - (quy tắc bối cảnh cho hoạt động giảm dần giống như hoạt động gia tăng)

- Phộp trừ con trỏ, vớ dụ: ptr1 - ptr2

- So sỏnh hai con trỏ sử dụng toỏn tử quan hệ, vớ dụ: ptr1> ptr2, ptr1 <ptr2, ptr1 = = ptr2, ptr1! = ptr2 vv (chỉ so sỏnh cỏc con trỏ cựng loại sẽ cho kết quả cú ý nghĩa)

200

- Lệnh * ptr ++ chỉ tăng con trỏ chứ khụng phải nội dung được trỏ bởi con trỏ ‘ptr’ và *ptr- - giảm con trỏ khụng phải nội dung được trỏ bởi con trỏ ‘ptr’

- Lệnh (* ptr) ++ tăng nội dung được trỏ bởi con trỏ ptr chứ khụng phải con trỏ ptr. (*ptr) - - giảm nội dung được trỏ bởi con trỏ ‘ptr’ và khụng phải con trỏ ‘ptr’

- Khụng thể sử dụng một con trỏ đỳc kiểu trong biểu thức gỏn và khụng thể tăng hoặc giảm, vớ dụ: ((int * ptr)) ++; sẽ khụng hoạt động theo cỏch mong đợi

- Con trỏ Null là một con trỏ chứa một giỏ trị đặc biệt gọi là NULL khụng phải là địa chỉ của bất kỳ biến hoặc hàm nào hoặc địa chỉ bắt đầu của khối bộ nhớ được phõn bổ trong phõn bổ bộ nhớ động

- Con trỏ của mỗi loại cú thể cú một con trỏ null liờn quan viz. cú thể cú con trỏ null kiểu ký tự, con trỏ null kiểu số nguyờn, v.v.

- NULL là một macro tiền xử lý được định nghĩa theo nghĩa đen là zero hoặc ((void*)0). #define NULL 0 hoặc #define NULL ((void *) 0)

- NULL là một số khụng đổi và cả hai cú thể được sử dụng thay thế cho nhau như cỏc hằng con trỏ Null

- Một con trỏ NULL cú thể được kiểm tra bởi toỏn tử if (). Xem vớ dụ sau: if (ptr) //ptr is a pointer declared

printf (“ptr is not a NULL pointer”); else

printf (“ptr is a NULL pointer”);

Cõu lệnh if (ptr) được chuyển đổi thành if (ptr! = 0) bởi trỡnh biờn dịch (chộo). Ngoài ra, bạn cú thể trực tiếp sử dụng cõu lệnh if (ptr! = 0) trong chương trỡnh của mỡnh để kiểm tra con trỏ NULL.

- Con trỏ Null là một khỏi niệm ngụn ngữ C và cú giỏ trị bờn trong khụng quan trọng. NULL luụn đảm bảo 0 cho bạn nhưng con trỏ Null khụng cần.

Một phần của tài liệu Bài giảng Xây dựng các hệ thống nhúng: Phần 2 (Trang 58 - 62)

Tải bản đầy đủ (PDF)

(196 trang)