Friday, 29 October 2010

[Project] Pointer in C

Chủ đề tuần này: post lên những gì bạn hiểu biết, giảng cho mọi người về con trỏ trong C. Comment vào dưới bài này! Mọi code ctrình minh họa hãy paste lên pastebin(có ở list tool bên tay phải của trang chính) và đưa link vào đây.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Trước khi vào nội dung, tớ sẽ đưa ra 2 khái niệm là declare và  initialize. Và kể cả trong các bài viết sau cũng sẽ khong dịch 2 từ này ra Tiếng Việt.
1. Declare: công bố hay khai báo(biến)
ví dụ này declare một biến tên là a:
 int a;
2. Initialize: khởi tạo giá trị ban đầu (hay gán giá trị đầu tiên cho biến). Đây chính là cách viết đầy đủ của từ Init
VD:
int a;//Declare
a=5;//Initialize



1.Định nghĩa:
- con trỏ là biến chứa(có nội dung là) địa chỉ của biến khác.
- Thực không có gì là biến con trỏ cả. Chỉ có một loại biến duy nhất. Và chúng khác nhau ở kiểu (int float...)
Từ "pointer variable" (biến con trỏ) thật ra mang nghĩa là "variable of a pointer type" (biến có kiểu pointer) Vậy ta dùng từ biến con trỏ với nghĩa là biến có kiểu con trỏ.





2. Khởi tạo một con trỏ. (Declaration)
VD:
int *conga;
int convit;
- ở đây biến convit có kiểu int. còn biến conga co kiểu int *. Hãy hiểu int * ở đây là một phép ghép
int ở 1 bên, *conga ở một bên. khi gặp nhau thì * kết hợp với int thành kiểu int *.

như vậy ta có thể tạo 2 con trỏ bằng cách:
int *p;
int *q;

hoặc
int *p,*q;
chứ không phải là
int *p,q;

Tưởng tượng ở đây là dấu * là 1 con chó, dấu phẩy là 1 bức tường. con chó không vượt đượt hàng rào nên không cắn được người q :D hè hè

3. Truy cập giá trị được trỏ đến
3.1 VD:
int *p;
p=45;
Đoạn code trên sẽ bị lỗi, bởi khi p là 1 biến trỏ thì nội dung của biến này là địa chỉ của 1 biến nào đó khác.
Đoạn code trên sẽ gán cho p trỏ đến địa chỉ 45 và ta không biết là địa chỉ 45 là ở đâu. Chương trình cố gắng truy cập đến ô này và kết quả là sẽ bị lỗi.
Khi compile thì compiler thường cảnh báo bạn việc gán một giá trị int cho 1 biến trỏ:
“warning: initialization makes pointer from integer without a cast”

Vậy để truy cập đ giá trị được trỏ đến ta phải dereference nó.

3.2 Dereferencing
Từ dereference áp dụng đối với con trỏ với nghĩa là truy  cập biến hay ô nhớ mà con trỏ trỏ tới.
vD:
#include
int main()
{
    int b=5,*a;    /*Declare biến b và init nó =5, declare biến con trỏ a */
    a=&b;//gán cho a địa chỉ của b <=> trỏ a đến b
    printf("%d",*a);//in ra mà giá trị a trỏ đến.
    return 1;
}


Toán tử dereference(*) tim kiếm value tồn tại tại 1 địa chỉ.
Vậy: khi x đã là 1 biến con trỏ thì x chứa địa chỉ, còn *x chứa giá trị mà con trỏ trỏ đến. Trong phép gán, nếu *x đứng bên phải dấu bằng, * sẽ là tóan tử "load" địa chỉ x; còn nếu *x đứng bên trái dấu bằng thì * là tóan tử "store" "vế phải" vào địa chỉ x