Danh mục

Những chủ đề tiến bộ trong C#

Số trang: 12      Loại file: pdf      Dung lượng: 120.63 KB      Lượt xem: 15      Lượt tải: 0    
tailieu_vip

Hỗ trợ phí lưu trữ khi tải xuống: 5,000 VND Tải xuống file đầy đủ (12 trang) 0
Xem trước 2 trang đầu tiên của tài liệu này:

Thông tin tài liệu:

Pointer Arithmetic Ta có thể cộng hay trừ số nguyên trên con trỏ.Ví dụ , giả sử ta có 1 con trỏ trỏ đến số nguyên,và ta thử cộng 1 vào giá trị của nó .trình biên dịch sẽ biết và tăng vùng nhớ lên 4 byte ( do kiểu int có kích thước 4 byte).
Nội dung trích xuất từ tài liệu:
Những chủ đề tiến bộ trong C# Những chủ đề tiến bộ trong C# Các mã không an toàn – Phần 2Pointer ArithmeticTa có thể cộng hay trừ số nguyên trên con trỏ.Ví dụ , giả sử ta có 1 con trỏtrỏ đến số nguyên,và ta thử cộng 1 vào giá trị của nó .trình biên dịch sẽ biếtvà tăng vùng nhớ lên 4 byte ( do kiểu int có kích thước 4 byte).nếu là kiểudouble thì khi cộng 1 sẽ tăng giá trị của con trỏ lên 8 byte.ta có thể dùng toán tử +, -, +=, -=, ++,và -- với biến bên phía phải của toántử này là long hay ulongVí d ụuint u = 3;byte b = 8;double d = 10.0;uint *pUint= &u; // size of a uint is 4byte *pByte = &b; // size of a byte is 1double *pDouble = &d; // size of a double is 8Giả sử địa chỉ của những con trỏ này trỏ đến là : pUint: 1243332 pByte: 1243328 pDouble: 1243320sau khi thi hành ta có :++pUint; // adds 1= 4 bytes to pUintpByte -= 3; // subtracts 3=3bytes from pBytedouble *pDouble2 = pDouble - 4; // pDouble2 = pDouble - 32 bytes (4*8bytes)Con trỏ sẽ có giá trị: pUint: 1243336 pByte: 1243321 pDouble2: 1243328Ta cũng có thể trừ 2 con trỏ với nhau .giá trị kết quả là kiểu long bằng giá trịcon trỏ chia cho kích thước của kiểu mà nó đại diện .Ví dụ :double *pD1 = (double*)1243324; // note that it is perfectly valid to // initialize a pointer like this.double *pD2 = (double*)1243300;long L = pD1-pD2; // gives the result 3 (=24/sizeof(double))Con trỏ đến Struct - Toán tử truy xuất các thành viên con trỏCũng giống như con trỏ trong các kiểu dữ liệu có sẵn. tuy nhiên thêm 1 điềukiện là - Struct không chứa bất kì kiểu tham chiếu nào.Do con trỏ không thểtrỏ đến bất kì kiểu tham chiếu nào. để tránh điều này , trình biên dịch sẽ phấtcờ lỗi nếu ta tạo ra một con trỏ đến bất kì Struct nào chứa kiểu tham chiếu .Giả sử ta có struct như sau :struct MyGroovyStruct{ public long X; public float F;}Sau đó ta định nghĩa con trỏ cho nó :MyGroovyStruct *pStruct;Khởi tạo nó :MyGroovyStruct Struct = new MyGroovyStruct();pStruct = &Struct;Cũng có thể truy xuất các giá trị thành viên của 1 struct bằng con trỏ :(*pStruct).X = 4;(*pStruct).F = 3.4f;Tuy nhiên cú pháp này hơi phức tạp. C# định nghĩa 1 toán tử khác cho phépta truy xuất các thành viên của Struct bằng con trỏ đơn giản hơn , gọi là toántử truy xuất thành viên con trỏ ,kí hiệu là ->Cách dùng :pStruct->X = 4;pStruct->F = 3.4f;Ta cũng có thể thiết đặt trực tiếp con trỏ của kiểu tương đương để trỏ đếncác trường trong Structlong *pL = &(Struct.X);float *pF = &(Struct.F);hay :long *pL = &(pStruct->X);float *pF = &(pStruct->F);Con trỏ đến các thành viên của lớpTa đã nói rằng không thể tạo ra con trỏ đến lớp.vì việc tạo có thể làm cho bộgom rác hoạt động không đúng.tuy nhiên ta có thể tạo các con trỏ đến các thành viên của lớp .Ta sẽ viết lạistruct của ví dụ trước như là lớp :class MyGroovyClass{ public long X; public float F;}sau đó ta có thể tạo 1 con trỏ đến các trường của nó ,X và F.tuy nhiên làmnhư vậy sẽ gây ra lỗi :MyGroovyClass myGroovyObject = new MyGroovyClass();long *pL = &( myGroovyObject.X); // wrongfloat *pF = &( myGroovyObject.F); // wrongDo X và F nằm trong 1 lớp , mà được đặt trong heap.nghĩa là chúng vẫn giántiếp chịu sự quản lý của bộ gom rác.cụ thể bộ gom rác có thể quyết định dichuyển MyGroovyClass đến 1 vị trí mới trong bộ nhớ để dọn dẹp heap.Nếulàm điều này thì bộ gom rác tất nhiên sẽ cập nhật tất cả các tham chiếu đếnđối tượng ,giả sử như biến myGrooveObject vẫn sẽ trỏ đến đúng vị trí.Tuynhiên bộ gom rác không biết gì về con trỏ cả. vì thế nếu di chuyển các đốitượng tham chiếu bởi myGrooveObject,pL và pF sẽ vẫn không thay đôỉ vàkết cuộc là trỏ đến sai vị trí vùng nhớ.Để giải quyết vấn đề này ta dùng từ khóa fixed , mà cho bộ gom rác biếtrằng có thể có con trỏ trỏ đến các thành viên của các thể hiện lớp,vì thế cácthể hiện lớp này sẽ không được di chuyển.cú pháp như sau nếu ta chỉ muốnkhai báo 1 con trỏ :MyGroovyClass myGroovyObject = new MyGroovyClass();// do whateverfixed (long *pObject = &( myGroovyObject.X)){ // do something}nếu ta muốn khai báo nhiều hơn 1 con trỏ ta có thể đặt nhiều câu lệnh fixedtrước khối mã giống nhau :MyGroovyClass myGroovyObject = new MyGroovyClass();fixed (long *pX = &( myGroovyObject.X))fixed (float *pF = &( myGroovyObject.F)){ // do something}Ta có thể lồng các khối fixed nếu ta muốn fix các con trỏ trong các thờiđiểm khác nhauMyGroovyClass myGroovyObject = new MyGroovyClass();fixed (long *pX = &( myGroovyObject.X)){ // do something with pX fixed (float *pF = &( myGroovyObject.F)) { // do something else with pF }}Ta cũng có thể khởi tạo vài biến trong cùng 1 k ...

Tài liệu được xem nhiều: