Lập trình

Lập trình

Thứ Hai, 16 tháng 6, 2014

Một số trường hợp của con trỏ c++

Nguồn tham khảo : condongcviet.com , và một số nguồn khác ...

Trước khi vào bài bài viết ta cùng tìm hiểu con trỏ void :
theo wiki : Ngôn ngữ C và C++ cũng cung cấp con trỏ chỉ kiểu void (được đặc tả bởi void *), nhưng đây là một khái niệm không có liên quan. Các biến kiểu này là các con trỏ chỉ đến dữ liệu của một kiểu chưa được xác định, vì thế ở ngữ cảnh này (nhưng không phải trong những ngữ cảnh khác) void đóng vai trò như một kiểu vạn năng hay kiểu top. Một chương trình có thể chuyển đổi một con trỏ chỉ đến kiểu bất kì của dữ liệu thành một con trỏ chỉ đến kiểu void và quay ngược lại kiểu ban đầu mà không làm mất thông tin, điều này khiến cho các con trỏ trở nên hữu ích trong các hàm đa hình (polymorphic function) (chú ý điều này không thật đúng đối với các con trỏ hàm vì các hàm không phải là dữ liệu[1]).

Bài viết khác có liên quan : 
Con trỏ void là loại con trỏ đặc biệt. Trong C++, void dùng để quy định sự không tồn tại của một kiểu dữ liệu (hay kiểu dữ liệu rỗng). Vì vậy, con trỏ void là con trỏ trỏ vào giá trị có kiểu dữ liệu void (cũng vì lẽ đó, mà nó không xác định độ dài và thuộc tính tham chiếu ngược).
Con trỏ void cho phép trỏ sang một kiểu dữ liệu bất kì. Nhưng khi chuyển đổi, chúng có một giới hạn rất lớn: dữ liệu trỏ bởi chúng không thể trực tiếp tham chiếu ngược, và vì nguyên nhân này, chúng ta cần ép kiểu địa chỉ của con trỏ void sang một con trỏ khác mà nó có một kiểu dữ liệu cụ thể trước khi tham chiếu ngược trở lại.

Chương trìnhKết quả
#include using namespace std;
void increase(void* data, int psize)
{
if(psize==sizeof(char))
{
char* pchar;
pchar=(char*)data;
++(*pchar);
}else if(psize==sizeof(int))
{
int* pint;
pint = (int*)data;
++(*pint);
}
}
int main()
{
char a = ‘x’;
int b = 1602;
increase(&a, sizeof(a));
increase(&b, sizeof(b));
cout<<<”, “<<
return 0;
}
y, 1603
Giải thích: hàm increase có hai tham số: tham số data là một con trỏ void, tham số psize là kích thước của con trỏ data. Câu lệnh if sẽ kiểm tra điều kiện xem biến trỏ data thuộc kiểu dữ liệu nào – nếu psize==sizeof(char) thì nó là con trỏ kiểu char, tương tự nếu psize==sizeof(int) thì nó là con trỏ kiểu int. Vì ở đây, ta chưa xác định được nó là con trỏ kiểu gì, nên ta sẽ sử dụng tham số là con trỏ void. Nếu là con trỏ char, ta sẽ sử dụng biến trỏ pchar để khởi tạo giá trị cho nó bằng cách ép kiểu từ con trỏ void. Hoàn toàn tương tự cho biến trỏ pint. Mục đích của hàm increase là tìm giá trị tiếp theo của tham số data. Trong hàm main, ta sử dụng hai biến char và int. Giá trị tiếp theo của kí tự ‘x’ là kí tự ‘y’, của số 1602 là 1603.

Một số trường hợp đặc biệt trong con trỏ (copy từ congdongcviet rất hữu ích)

1. Hiểu lầm về cách cho p trỏ vào a






2. Cùng trỏ vào 1 biến




3. Con trỏ đa cấp




4. Con trỏ trỏ đến ô nhớ đã biết




5. Con trỏ void
Con trỏ void là 1 con trỏ đặc biệt, thích trỏ đi đâu thì trỏ

PHP Code:
int ham() 

    return 
1

void main() 

    
int a
    
void *p,*q
    
p=ham
    
q=&a
}  




Không có nhận xét nào:

Đăng nhận xét