Skip to main content

Con trỏ cấu trúc và ví dụ (Bài nháp)

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ọa
Khi 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.html
http://www.programiz.com/c-programming/c-structures-pointers
http://coltech.vnu.edu.vn/httt/components/com_joomlaboard/uploaded/files/thcs2_tuan8.pdf




Comments

Post a Comment

Popular posts from this blog

How to test frame buffer in linux

The intended goal of this article is to provide the user with enough information so they can display an image onto a screen of their choosing. How to re-build frame buffer testing application. Base knowledge http://trac.gateworks.com/wiki/OpenEmbedded/Video_Out Frame buffer test application - rebuild fb-test-app step 1: Download soure code ( git installed on your machine and account in git-hub is required) https://github.com/prpplague/fb-test-app Command in git: git init git clone https://github.com/prpplague/fb-test-app.git step 2: Change makefile vi Makefile //open Makefile by vim editor :set nu //show line number replace from line 6 to line 12 by folow code: CC=arm-linux-gnueabi-gcc CFLAGS=-02 -Wall Save change command :wq step 3: Rebuid Type “make” command step 4: Copy execute file to target system by filezilla or something like that step 5: Remote target by root account, change mode of execute file (what copied from host)

[Git] Handle trailing space when patching with git

After complete coding one module in development branch. Next phase is merging. Obviously, you can merge source code automatically without no errors happen. However, life is not dream. Create a patch git diff HEAD > newTariff.patch Apply patch git apply newTariff.patch then problem happens Problem git apply newTariff.patch:106: trailing whitespace. patch does not apply Route cause: Nguyên nhân: Do trong source code có những dấu space thừa (ô vuông màu đỏ hình dưới) Some whitespaces is existed in your patch. (red area in below pictures) Fix Clean white space and patch again. Cách khắc phục Xóa những dấu space này đi và thực hiện patch lại Make up after complete coding. Find and clean whitespace before create patch file. Sửa sau khi code xong Kiểm tra sau khi code xong có lỗi này không git diff HEAD --check Prevent whitespace by manually when typing source code Sửa ngay khi đang code =>Bật chức năng hiển thị các dấu whitespace, hoặc remove trailing

[Vi] Công nghệ phát triển ngược đời - How is AI harming my world

Tiếng cười khanh khách của mấy cậu sinh viên quốc tế người Bắc Ấn sau bài kiểm tra cuối khóa (a final exam) làm gã thấy buồn một góc tâm hồn. Sự trống rỗng ngay lập tức xâm chiếm lấy tâm trí gã sau khi nộp bài môn thi cuối cùng của kỳ học. Gã hiểu gã quá mà, gã đang cố gắng giải thích cho nỗi nhục của chính bản thân ở bên trong. Đầu gã thoáng nghĩ về cái lần thi cuối kỳ một môn học ở bậc thạc sỹ nơi quê nhà hơn mười năm về trước, cái ánh mắt khinh bỉ đến ám ảnh của một anh dọn vệ sinh dành cho những học viên cao học đang quay cóp trong giờ thi của một trường đại học hàng đầu quốc gia như vết dao khứa vào lòng tự trọng của gã. Vết thương vẫn nhói đau lại khi những mùa thi đến. Một lão già sinh viên quốc tế ranh ma. Gã đang học lại cái thứ mà gã đã học từ hai mươi năm về trước với một thứ ngôn ngữ không mới và cái tâm bằng sắt nung. Kinh nghiệm làm việc chuyên môn lâu năm cộng với việc vừa được trang bị thứ vũ khí khoa học tối tân AI (Trí truệ nhân tạo) khiến lão trở thành sát thủ trong