Giáo trình ngôn ngữ C



tải về 2.34 Mb.
Chế độ xem pdf
trang52/62
Chuyển đổi dữ liệu16.03.2023
Kích2.34 Mb.
#54376
1   ...   48   49   50   51   52   53   54   55   ...   62
C ĐHQGHN

V.4 - Con trỏ và mảng
 
Trong phần này chúng xem xét kỹ hơn về các tổ chức của mảng trong bộ nhớ; liên hệ 
giữa mảng, các phần tử của mảng với con trỏ, các phép toán trên con trỏ. Tuy nhiên con 
trỏ là một kiểu quan trong của C. Trong phần này chúng tôi chưa đề cập tới hết tất cả các 
khía cạnh của con trỏ như cấp phát động, tryền tham số hàm là con trỏ, danh sách liên kết. 
Các nội dung này sẽ được giới thiệu trong chuyên đề kỹ hơn về C. 
V.4.1 - Con trỏ và các phép toán trên con trỏ 
Trong phần đầu trình bày về kiểu dữ liệu và các phép toán chúng ta cũng đã đề cập tới 
kiểu con trỏ, trong phần này chúng ta dề cập chi tiết hơn về con trỏ và các phép toán có 
thể sử dụng trên chúng. 
Con trỏ là kiểu dữ liệu mà một thành phần kiểu này có thể lưu trữ địa chỉ của một 
thành phần nào đó (có thể là biến, hằng, hàm), hoặc ta nói nó trỏ tới thành phần đó. 


Gi¸o tr×nh tin häc c¬ së II - N
gôn ngữ
 C
80
Một con trỏ lưu trữ địa chỉ của một thành kiểu T thì ta nói p là con trỏ kiểu T, đặc biệt 
nếu T là một kiểu con trỏ, hay nói cách khác, p lưu trữ địa chỉ của một con trỏ khác thì ta 
nói p là con trỏ trỏ tới con trỏ. 
Cú pháp khai báo con trỏ 
 *
Ví 
dụ:
int 
*p; 
 // p là con trỏ kiểu int 
float * q ;  // q là con trỏ kiểu float 
 
char *s ; // s là con trỏ kiểu char hay xâu kí tự 
int ** r; // r là con trỏ tới con trỏ kiểu int 
Cũng giống như biến bình thường khi khai báo một biến con trỏ, chương trình dịch 
cũng cấp phát vùng nhớ cho biến đó, lưu ý rằng giá trị trong vùng nhớ đó đang là bao 
nhiêu thì quan niệm đó là địa chỉ mà con trỏ này trỏ tới. Vì vậy các bạn phải chú ý khi 
dùng con trỏ phải bảo đảm nó trỏ tới đúng vùng nhớ cần thiết. 
Một con trỏ chưa lưu trữ địa chỉ của thành phần nào ta gọi là con trỏ rỗng và có giá trị 
là NULL (là một hằng định nghĩa sẵn thực ra = 0). 
Khi 
gặp các lệnh khai báo biến trong chương trình thì chương trình dịch sẽ cấp phát 
vùng nhớ phù hợp và 'gắn' tên biến với vùng nhó đó. 
Ví 
dụ: 
int tuoi; 
float luong; 
Nếu chúng ta có con trỏ p kiểu float, p lưu địa chỉ của luong và luong 65000 như sau: 
float luong;
float * p; 
giả sử địa chỉ 1000 


Gi¸o tr×nh tin häc c¬ së II - N
gôn ngữ
 C
81
p = &luong; 
*p = 650000 
Khi 
con 
trỏ trỏ tới một vùng nhớ ví dụ như p trỏ tới luong thì khi truy xuất *p chính là 
giá trị của vùng nhớ do trỏ tới tức là *p 
⇔ luong. 
Với con trỏ trỏ tới một con trỏ khác chẳng hạn như ví dụ sau: 
int 


10; 
int 
*pa; 
int 
**ppa; 
pa = &a; // p trỏ tới a 
ppa = &pa; // ppa trỏ tới pa 
thì chúng ta có: 
*ppa 
⇔ pa ⇔ &a;
**ppa 
⇔ *pa ⇔ a; 
• 
Các phép toán trên con trỏ (địa chỉ )

tải về 2.34 Mb.

Chia sẻ với bạn bè của bạn:
1   ...   48   49   50   51   52   53   54   55   ...   62




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