Structure pointer and example
Khi làm việc với con trỏ, mình thỉnh thoảng cứ hay lẫn lộn giữa các ký hiệu & (Ampersand). *(Asterisk), -> (arrow), .(Full stop). Sau đây là một số ví dụ minh họaKhi nào dùng dấu chấm, khi nào dùng dấu trỏ
Biến (Variable)
Về cơ bản, 1 biến được khai báo trong chương trình có 2 đặc điểm nhận dạng:- Địa chỉ của biến đó ( biến đó được cấp phát 1 hoặc 1 vài ô nhớ trong RAM, nó giống như số nhà bạn vậy.
Khi ai đó cần chuyển thư, chỉ cần look up số nhà bạn, là có thể chuyển được)
- Giá trị của biến đó (ví dụ, nhà to nhà bé, nhà màu vàng, nhà màu đỏ ..vvv
Ví dụ:
Khi bạn khai báo
int foo = 10;
Thằng biến foo sẽ được chương trình cho 1 chỗ ở tại địa chỉ 0x1234 gì đó (phụ thuộc vào hệt điều hành, nền tảng phần cứng mà bạn đang sử dụng 8 bít, 16 bít, 32, 64.._
Giá trị thằng foo này là 10.
Trong ngôn ngữ C, khi bạn gọi
&foo sẽ trả về giá trị = 0x1234, là địa chỉ của thằng foo
foo sẽ trả về 10
*foo, ko trả về gì, thằng dấu asterisk này chỉ dùng cho con trỏ.
Question: tôi muốn đổi địa chỉ của thằng biến foo trong RAM thì làm thế nào?
Answer: Tác giả đoán là ko làm được :-(
Con trỏ (Pointer)
Con trỏ trước hết là 1 biến, vậy nó cũng có địa chỉ và giá trị của chính nó.C cung cấp con trỏ như một cách dùng để truy nhập gián tiếp vào 1 biến khác. (Bình thường bạn có thể dùng tên biến, con trỏ cho phép bạn gán giá trị cho biến đó qua địa chỉ của biến đó)
Ví dụ:
int *p; //p được khởi tạo tại địa chỉ 0xABFF, nhưng chưa có giá trị
int foo = 10; // foo được khởi tạo tại địa chỉ 0X1234, với giá trị là 10
p = &foo; //p được gán giá trị, lúc này p = 0x1234, hay p đang trỏ vào địa chỉ 0x1234
Vậy
*p = 10 //dấu *, thể hiện giá trị ô nhớ mà p trỏ đến, trong trường hợp này là ô nhớ tại địa chỉ 0x1234
p = 0x1234 //giá trị của p, hay tại ô nhớ 0xABFF, ô này có giá trị là 0x1234
&p = 0xABFF; //địa chỉ của bản thân thằng p
*p = 12 ;
//sau phép gán này, ô nhớ mà p đang trỏ đến (0x1234, giá trị 10) sẽ có giá trị là 12, hay foo =12. Vậy, gián tiếp qua p ta có thể gán giá trị cho foo
Cấu trúc (Structure)
typedef sfoo{
int id;
char *name;
sfoo *pnext;
}_sfoo_t;
Con trỏ cấu trúc (Structure pointer)
_sfoo_t *pssfoo;Truy suất vào các phần tử của cấu trúc
Truy suất vào các phần tử của cấu trúc qua con trỏ cấu trúc
Danh sách liên kết (Link list)
(Cont)Con trỏ hàm (Fucntion pointer)
(Cont)Con trỏ hai chiều (2d pointer)
(Cont)Reference
http://www-ee.eng.hawaii.edu/~tep/EE160/Book/chap12/subsection2.1.1.4.htmlhttp://www.programiz.com/c-programming/c-structures-pointers
http://coltech.vnu.edu.vn/httt/components/com_joomlaboard/uploaded/files/thcs2_tuan8.pdf
anh làm 1 bài hàm callback đi
ReplyDelete