Bài 1 : Cấu Trúc Của Một Chương Trình C++


Các hàm để thao tác trên chuỗi



tải về 448.29 Kb.
trang11/14
Chuyển đổi dữ liệu02.09.2016
Kích448.29 Kb.
#31125
1   ...   6   7   8   9   10   11   12   13   14

Các hàm để thao tác trên chuỗi


Thư viện cstring (string.h) không chỉ có hàm strcpy mà còn có nhiều hàm khác để thao tác trên chuỗi. Dưới đây là giới thiệu lướt qua của các hàm thông dụng nhất:

strcat:   char* strcat (char* dest, const char* src);

Gắn thêm chuỗi src vào phía cuối của dest. Trả về dest.



strcmp:   int strcmp (const char* string1, const char* string2);

So sánh hai xâu string1string2. Trả về 0 nếu hai xâu là bằng nhau.



strcpy:   char* strcpy (char* dest, const char* src);

Copy nội dung của src cho dest. Trả về dest.



strlen:   size_t strlen (const char* string);

Trả về độ dài của string.

Chú ý: char* hoàn toàn tương đương với char[]

Bài 9 : Con Trỏ

Chúng ta đã biết các biến chính là các ô nhớ mà chúng ta có thể truy xuất dưới các tên. Các biến này được lưu trữ tại những chỗ cụ thể trong bộ nhớ. Đối với chương trình của chúng ta, bộ nhớ máy tính chỉ là một dãy gồm các ô nhớ 1 byte, mỗi ô có một địa chỉ xác định.

Một sự mô hình tốt đối với bộ nhớ máy tính chính là một phố trong một thành phố. Trên một phố tất cả các ngôi nhà đều được đánh số tuần tự với một cái tên duy nhất nên nếu chúng ta nói đến số 27 phố Trần Hưng Đạo thì chúng ta có thể tìm được nơi đó mà không lầm lẫn vì chỉ có một ngôi nhà với số như vậy.

Cũng với cách tổ chức tương tự như việc đánh số các ngôi nhà, hệ điều hành tổ chức bộ nhớ thành những số đơn nhất, tuần tự, nên nếu chúng ta nói đến vị trí 1776 trong bộ nhớ chúng ta biết chính xác ô nhớ đó vì chỉ có một vị trí với địa chỉ như vậy.

Toán tử lấy địa chỉ (&).


Vào thời điểm mà chúng ta khai báo một biến thì nó phải được lưu trữ trong một vị trí cụ thể trong bộ nhớ. Nói chung chúng ta không quyết định nơi nào biến đó được đặt - thật may mắn rằng điều đó đã được làm tự động bởi trình biên dịch và hệ điều hành, nhưng một khi hệ điều hành đã gán một địa chỉ cho biến thì chúng ta có thể muốn biết biến đó được lưu trữ ở đâu.

Điều này có thể được thực hiện bằng cách đặt trước tên biến một dấu và (&), có nghĩa là "địa chỉ của". Ví dụ:

ted = &andy;

sẽ gán cho biến ted địa chỉ của biến andy, vì khi đặt trước tên biến andy dấu và (&) chúng ta không còn nói đến nội dung của biến đó mà chỉ nói đến địa chỉ của nó trong bộ nhớ.

Giả sử rằng biến andy được đặt ở ô nhớ có địa chỉ 1776 và chúng ta viết như sau:

andy = 25;


fred = andy;
ted = &andy;

kết quả sẽ giống như trong sơ đồ dưới đây:



Chúng ta đã gán cho fred nội dung của biến andy như chúng ta đã làm rất lần nhiều khác trong những phần trước nhưng với biến ted chúng ta đã gán địa chỉ mà hệ điều hành lưu giá trị của biến andy, chúng ta vừa giả sử nó là 1776.

Những biến lưu trữ địa chỉ của một biến khác (như ted ở trong ví dụ trước) được gọi là con trỏ. Trong C++ con trỏ có rất nhiều ưu điểm và chúng được sử dụng rất thường xuyên, Tiếp theo chúng ta sẽ thấy các biến kiểu này được khai báo như thế nào.

Toán tử tham chiếu (*)


Bằng cách sử dụng con trỏ chúng ta có thể truy xuất trực tiếp đến giá trị được lưu trữ trong biến được trỏ bởi nó bằng cách đặ trước tên biến con trỏ một dấu sao (*) - ở đây có thể được dịch là "giá trị được trỏ bởi". Vì vậy, nếu chúng ta viết:

beth = *ted;

(chúng ta có thể đọc nó là: "beth bằng giá trị được trỏ bởi ted" beth sẽ mang giá trị 25, vì ted bằng 1776 và giá trị trỏ bởi 177625.

Bạn phải phân biệt được rằng ted có giá trị 1776, nhưng *ted (với một dấu sao đằng trước) trỏ tới giá trị được lưu trữ trong địa chỉ 1776, đó là 25. Hãy chú ý sự khác biệt giữa việc có hay không có dấu sao tham chiếu.



beth = ted; // beth bằng ted ( 1776 )

beth = *ted; // beth bằng giá trị được trỏ bởi( 25 )

Toán tử lấy địa chỉ (&)
Nó được dùng như là một tiền tố của biến và có thể được dịch là "địa chỉ của", vì vậy &variable1 có thể được đọc là "địa chỉ của variable1".

Toán tử tham chiếu (*)
Nó chỉ ra rằng cái cần được tính toán là nội dung được trỏ bởi biểu thức được coi như là một địa chỉ. Nó có thể được dịch là "giá trị được trỏ bởi"..
*mypointer được đọc là "giá trị được trỏ bởi mypointer".

Vào lúc này, với những ví dụ đã viết ở trên

andy = 25;


ted = &andy;

bạn có thể dễ dàng nhận ra tất cả các biểu thức sau là đúng:

andy == 25

&andy == 1776

ted == 1776

*ted == 25


Khai báo biến kiểu con trỏ


Vì con trỏ có khả năng tham chiếu trực tiếp đến giá trị mà chúng trỏ tới nên cần thiết phải chỉ rõ kiểu dữ liệu nào mà một biến con trỏ trỏ tới khai báo nó. Vì vậy, khai báo của một biến con trỏ sẽ có mẫu sau:

type * pointer_name;

trong đó type là kiểu dữ liệu được trỏ tới, không phải là kiểu của bản thân con trỏ. Ví dụ:

int * number;
char * character;
float * greatnumber;

đó là ba khai báo của con trỏ. Mỗi biến đầu trỏ tới một kiểu dữ liệu khác nhau nhưng cả ba đều là con trỏ và chúng đều chiếm một lượng bộ nhớ như nhau (kích thước của một biến con trỏ tùy thuộc vào hệ điều hành). nhưng dữ liệu mà chúng trỏ tới không chiếm lượng bộ nhớ như nhau, một kiểu int, một kiểu char và cái còn lại kiểu float.

Tôi phải nhấn mạnh lại rằng dấu sao (*) mà chúng ta đặt khi khai báo một con trỏ chỉ có nghĩa rằng: đó là một con trỏ và hoàn toàn không liên quan đến toán tử tham chiếu mà chúng ta đã xem xét trước đó. Đó đơn giản chỉ là hai tác vụ khác nhau được biểu diễn bởi cùng một dấu.


// my first pointer

#include


int main ()

{

int value1 = 5, value2 = 15;



int * mypointer;
mypointer = &value1;

*mypointer = 10;

mypointer = &value2;

*mypointer = 20;

cout << "value1==" << value1 << "/ value2==" << value2;

return 0;

}


value1==10 / value2==20

Chú ý rằng giá trị của value1value2 được thay đổi một cách gián tiếp. Đầu tiên chúng ta gán cho mypointer địa chỉ của value1 dùng toán tử lấy địa chỉ (&) và sau đó chúng ta gán 10 cho giá trị được trỏ bởi mypointer, đó là giá trị được trỏ bởi value1 vì vậy chúng ta đã sửa biến value1 một cách gián tiếp

Để bạn có thể thấy rằng một con trỏ có thể mang một vài giá trị trong cùng một chương trình chúng ta sẽ lặp lại quá trình với value2 và với cùng một con trỏ.

Đây là một ví dụ phức tạp hơn một chút:

// more pointers

#include


int main ()

{

int value1 = 5, value2 = 15;



int *p1, *p2;
p1 = &value1; // p1 = địa chỉ của value1

p2 = &value2; // p2 = địa chỉ của value2

*p1 = 10; // giá trị trỏ bởi p1 = 10

*p2 = *p1; // giá trị trỏ bởi p2 = giá trị trỏ bởi p1

p1 = p2; // p1 = p2 (phép gán con trỏ)

*p1 = 20; // giá trị trỏ bởi p1 = 20

cout << "value1==" << value1 << "/ value2==" << value2;

return 0;

}


value1==10 / value2==20

Một dòng có thể gây sự chú ý của bạn là:

int *p1, *p2;

dòng này khai báo hai con trỏ bằng cách đặt dấu sao (*) trước mỗi con trỏ. Nguyên nhân là kiểu dữ liệu khai báo cho cả dòng là int và vì theo thứ tự từ phải sang trái, dấu sao được tính trước tên kiểu. Chúng ta đã nói đến điều này trong bài 1.3: Các toán tử.


Каталог: gallery
gallery -> Album hưƠng xuâN. Thơ phổ nhạC. Phòng thu audio. Nhạc Sĩ Đình Đạm
gallery -> Phụ cấp độc hại, nguy hiểm
gallery -> BỘ TÀi chính cộng hoà XÃ HỘi chủ nghĩa việt nam độc lập Tự do Hạnh phúc
gallery -> Nobel văn chương năm 1987 joseph brodsky
gallery -> TÊN ĐỀ TÀi luận văn thạc sĩ khnn chuyên ngành chăn nuôi từ NĂM 1996 2012
gallery -> BÁo cáo công khai đIỀu kiệN ĐẢm bảo chất lưỢng đÀo tạo tiến sĩ Tên chuyên ngành, mã số, quyết định giao chuyên ngành đào tạo
gallery -> CHƯƠng I kế toán vốn bằng tiềN
gallery -> KẾ toán vốn bằng tiền I. YÊU cầU
gallery -> Phụ lục II nguyên tắC, NỘi dung và KẾt cấu tài khoản kế toáN

tải về 448.29 Kb.

Chia sẻ với bạn bè của bạn:
1   ...   6   7   8   9   10   11   12   13   14




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2024
được sử dụng cho việc quản lý

    Quê hương