Tính toán con trỏ

Trong C++ chúng ta có thế thực hiện cộng hay trừ số nguyên trên con trỏ. Điều này thường xuyên được sử dụng bởi các lập trình viên được gọi là các tính toán con trỏ. Tính toán con trở thì không giống như là tính toán số nguyên bởi vì kết quả phụ thuộc vào kích thước của đối tượng được trỏ tới.

Ví dụ, một kiểu int được biểu diễn bởi 4 byte. Bây giờ chúng ta có

char *str="HELLO";

int nunisQ = {10,20,30,40};

int *ptr=&nums[0]; //trỏ tới phần tử đầu tiên

Str-M- tăng str lên một char (nghĩa là 1 byte) sao cho nó trỏ tới kỷ tự thứ hai của chuỗi "HELLO" nhưng ngược lại ptr-H- tăng ptr lên một int (nghĩa là 4 bytes) sao cho nó trỏ tới phần tử thứ hai của nums. Hình dưới đây minh họa sơ lược điều này.

Hình 7.1. Minh họa lưu trữ bộ nhớ

Vì thế, các phần tư của chuỗi "HELLO" có thể được tham khảo tới như str, (str+1), (str+2), vâng vâng. Tương tự, các phần tử của nums có thế được tham khảo tới như ptr, (ptr+1), (ptr+2), và *(ptr+3).

Một hình thức khác của tính toán con trỏ được cho phép trong C++ liên quan đến trừ hai con trỏ của cùng kiểu. Ví dụ:

int *ptrl = &nums[l];

int*ptr2=&nums[3];

int n = ptr2 - ptrl; //n trở thành 2

Tính toán con trỏ cần khéo léo khi xử lý các phần tử của mảng. Đoạn mã sau trình bày ví dụ một hàm sao chép chuồi tương tự như hàm định nghĩa sẵn strcpy.

1. void ColyString(char *dest, char *src)

2. {

3. while (*dest++ = *src++)

4. }

Chú giải:

  • Dòng 3 điều kiện của vòng lặp này gán nội dung của chuỗi src cho nội dung của chuỗi dest và sau đó tăng cả hai con trỏ. Điều kiện này trở thành 0 khi ký tự null kết thúc của chuỗi src được chép tới chuỗi dest.

Một biến mảng (như nums) chính nó là địa chỉ của phần từ đầu tiên của mảng mà nó đại diện. Vì thế các phần tử của mảng nums cũng có thể được tham khảo tới bằng cách sử dụng tính toán con trở trên nums, nghĩa là nums[i] tương đương với *(nums + i). Khác nhau giữa nums và ptr ở chồ niuns là một hằng vì thế nó không thể được tạo ra đế trỏ tới bất cứ thứ gì nữa trong khi ptr là một biến và có thể được tạo ra đế trỏ tới các số nguyên bất kỳ.

Đoạn mã dưới trình bày hàm HighestTemp (đã được trình bày trước đó) có thể được cải tiến như thế nào bằng cách sử dụng tính toán con trỏ.

1. int HightestTemp(const int *temp, const int rows, const int columns)

2. {

3. int highest = 0;

4. for (register i = 0; i < rows; i++)

5. for (register j = 0; j < columns; j++)

6. if (*(temp + i * columns + j) > highest)

7. highest = *(temp + i * columns + j);

8. return highest;

9. }

Chú giải:

  • Dòng 1 thay vì truyền một mảng tới hàm, ta truyền một con trò int và hay tham số thêm vào đặc tả kích cỡ của mảng. Theo cách này thì hàm không bị hạn chế tới một kích thước mảng cụ thể.
  • Dòng 6 biểu thức (temp + i columns + j) tương đương với temp[i][j] trong phiên bản hàm trước.

Hàm HighestTemp có thể được đơn giản hóa hơn bằng cách xem temp như là một mảng một chiều của row * column số nguyên. Điều này được trình bày trong đoạn mã sau:

int HighestTemp (const int *temp, const int rows, const int columns)

{

int highest=0;

for (register i=0; i < rows * columns; ++i)

if (*(temp+ i) > highest)

highest= *(temp+ i);

return highest;

}

results matching ""

    No results matching ""