Chuyển đến nội dung chính

Con TRỏ Và Các Phép Toán Trên Con Trỏ Trong C

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 đó. 
 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ỏ 
 <kiểu> * <tên_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ó đó.
 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 p 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 a = 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ỉ )
 a. Phép so sánh hai con trỏ
 Trên con trỏ tồn tại các phép so sánh (= =, !=, <, <=, >,>=) hai con trỏ bằng nhau là hai con trỏ cùng trỏ tới một đối tượng (có giá trị bằng nhau), ngược lại là khác nhau. Con trỏ trỏ tới vùng nhớ có địa chỉ nhỏ hơn là con trỏ nhỏ hơn.  
Các phép toán so sánh cũng được áp dụng đối với con trỏ, thực chất là so sánh
giữa địa chỉcủa hai nơi được trỏbởi các con trỏnày. Thông thường các phép so sánh
<, <=, >, >= chỉáp dụng cho hai con trỏtrỏ đến phần tửcủa cùng một mảng dữliệu
nào đó. Thực chất của phép so sánh này chính là so sánh chỉsốcủa 2 phần tử được trỏ
bởi 2 con trỏ đó.
- ví dụ : 
float a[100], *p, *q ; 
p = a ;                    // p trỏ đến mảng (tức p trỏ đến a[0]) 
q = &a[3] ;               // q trỏ đến phần tử thứ3 (a[3]) của mảng 
cout << (p < q) ;         // 1 
cout << (p + 3 == q) ;    // 1 
cout << (p > q - 1) ;     // 0 
cout << (p >= q - 2) ;    // 0 
for (p=a ; p < a+100; p++) cout << *p ;  // in toàn bộ mảng a
b. Phép cộng con trỏ với số nguyên
 Giả sử p là con trỏ kiểu T, k là số nguyên  thì (p + k)  cũng là con trỏ kiểu T,  không mất tổng quát  giả sử p trỏ tới phần tử t thì 
 - p+1 là con trỏ trỏ tới một phần tử kiểu T kế tiếp sau t  à p+2 trỏ tới một phần tử kiểu T kế tiếp sau t 2 phần tử,... 
- p -1 là con trỏ trỏ tới một phần tử kiểu T kế tiếp trước t  
- p -2 trỏ tới một phần tử kiểu T kế tiếp trước t  hai phần tử,... 
- tổng quát p+k trỏ tới phần tử cách t một khoảng k phần tử kiểu T (nếu k >0 dịch về phía địa chỉ lớn, k<0 thì dịch về phía địa chỉ nhỏ).  
Ví dụ:    
 int a; // giả sử  a có địa chỉ 150    
int *p; 
   p = &a;  
 thì p+1 là con trỏ kiểu nguyên và p+1 trỏ tới địa chỉ 152; p + k trỏ tới 150 +2*k. c. Phép trừ hai con trỏ  N ếu p, q là hai con trỏ cùng kiểu T thì p-q là số nguyên là số các phần tử kiểu T nằm giữa hai phần tử do p và q trỏ tới. 
 Ví dụ:  
    int *p, *q; 
   giả sử p trỏ tới phần tử có địa chỉ 180, q trỏ tới phần tử có địa chỉ 160 thì  
 (p-q) = = 10;    
 float *r1, *r2;  
 giả sử r1 trỏ tới phần tử có địa chỉ 120, r2 trỏ tới phần tử có địa chỉ 100 thì  
 (r1-r2) = = 5;  

Phép gán con trỏ

Hai con trỏ cùng kiểu có thể gán cho nhau.
Ví dụ
int a, *p, *q ;
float *f;  a = 5 ;
p = &a ; q = p ; /* đúng */ 

Nhận xét

Bài đăng phổ biến từ blog này

Entry Test của FPT

IQ - Kiểm tra tư duy logic (8/20) - GMAT- Kiểm tra khả năng tính toán trong thời gian ngắn (8/20) - Tiếng Anh (18-> 25/50) - Các bài thi chuyên môn - FE (8/20) IQ: lên mạng tìm "IQ test" là ra đầy. + GMAT: Những câu trắc nghiệm tính toán đơn giản kiểu như sau:  1 . Một shop thời trang sale off quần jeans 15 %, quần jeans giá 450 $, người mua đưa 500 $, hỏi cashier trả lại bao nhiêu $ tiền thừa.? 2 . 100 % là 180 , vậy 150 là bao nhiêu %? Tiếng anh: Cỡ như thi TOEIC thôi. Chuyên môn: Mobile thì trắc nghiệm Java. Qúa trình tuyển như sau :v Lần 1: Test IQ, Tiếng Anh( mình làm í ẹ khoảng 50% mà vẫn được) , Java Lân 2: được gọi điện lên :)) + Gioi thiệu bản thân + Họ chỉ hỏi các câu căn bản như: -. OOP: là gì, 4 tính chất, ví dụ, khác nhau giữa interface và abstract - CODE: hầu toàn các bài toán vòng for :)) , cẩn thận mấy câu kế thừa. SQL (distinct, view, function, cursor, store procedure, ...v.v.), nhớ có câu cộng 2 số int không dùng biến đệm hơi khoai haha + Nói ch...

Java: Java Package-Thư viện trong Java

Giới thiệu về Package Các bạn mới học lập trình Java thường không dể ý tới package vì các bạn toàn tạo file .java vào cùng 1 chỗ, không cần sắp xếp, không cần quản lý truy nhập. Nhưng để tăng kỹ năng lập trình với Java, các bạn cần phải tìm hiểu về package trong Java. Các bạn có thể tham khảo định nghĩa sau: Package được dùng để đóng gói các lớp trong chương trình lại với nhau thành một khối. Đây là cách tốt nhất để lưu trữ các lớp gần giống nhau hoặc có cùng một module thành một khối thống nhất – để đáp ứng 1 khối chức năng. Từ đây mình sẽ giới thiệu thêm với các bạn các câu lệnh nhâp khẩu,nó có định dạng như sau : Định dạng :  import javaPackageNameImport;    Nó giống như khai báo thư viện ở các ngôn ngữ lập trình khác.Như vậy,chỉ khi các bạn nhập khẩu chúng,các bạn mới có thể sử dụng thư viện mà chúng cung cấp cho ta. VD :    import java.util.Date;   import java.text.SimpleDateFormat; Lưu ý : -Các câu lệnh nhập khẩu rất nhiều và...

phỏng vấn Embedded C và C++?

Có vài điểm rất nhỏ, các bạn không để ý có thể dẫn đến bất lợi (nếu không muốn nói là rớt) ở vòng hồ sơ hoặc khi đi phỏng vấn. Mình liệt kê rất cụ thể ra những chuyện mình đã thấy qua nhiều lần (người thật, việc thật), hy vọng cho các bạn thêm kinh nghiệm. Lưu ý: Những chuyện này rất chủ quan, có thể chỉ đúng trong môi trường của mình và hoàn toàn không đúng trong môi trường khác. Gửi email CV đến không có Cover Letter, chỉ đính kèm mỗi file PDF là cái CV. CV ghi : tiếng Anh: Trung Bình, C: Trung Bình,... nhưng bên dưới lại ghi ưu điểm_:  là người ham học hỏi... CV bằng tiếng Việt và lại viết sai chính tả tiếng Việt. CV ghi quá nhiều về các hoạt động tình nguyện, hiến máu, blah blah... nhưng phần kĩ thuật lại có 3 dòng thôi. Mặc đồ thể dục của trường và đi dép lê đến PV. Đến muộn PV (em ấy bảo bị kẹt xe). Đưa yêu cầu, em ấy không hiểu đề nhưng ngại không dám hỏi lại, dẫn đến viết hoàn toàn sai. Hỏi ngay câu căn bản đầu tiên em ấy đã nói không biết và  đổ do trường kh...