2010-11-01 47 views
5

Điều này có thể là đơn giản, nhưng tôi cố gắng cố gắng hiểu và hiểu rõ hơn về con trỏ. phép nói rằng tôi có một cấu trúcC++ Câu hỏi con trỏ cấu trúc

struct Person{ 
    char Name[20]; 
    char ID[15]; 
    char Address[50]; 
    char Number[15]; 
}; 

và cho phép nói rằng tôi có một loạt các lưu trữ trong bộ nhớ như một sau khi khác. vì vậy bây giờ tôi khai báo một con trỏ mới cho cấu trúc.

struct Person *ptr; 

Con trỏ này có bắt đầu ở mục FIRST không? (còn gọi là "Tên" đầu tiên) và khi tôi lặp lại nó (hay còn gọi là ptr ++), nó sẽ chuyển đến STRUCT tiếp theo hoặc "mục nhập" tiếp theo cũng giống như tên -> ID ---> Địa chỉ

Vì vậy, hãy nói Im vào mục đầu tiên ví dụ và các dữ liệu là:

Jason Adams 
111222333 
111 Fake Drive 
55555551000 

và mục thứ hai là

Matt Johns 
111555333 
555 Derp lane 
1000022434 

bây giờ tôi lặp các ptr (ptr ++) sẽ điểm ptr đến struct thứ hai (một với mờ johns) hoặc nó sẽ trỏ đến Jason Adams "ID"

Tôi hy vọng điều này có ý nghĩa?

Trả lời

5

Nó sẽ trỏ đến cấu trúc thứ hai. Con trỏ sẽ được nâng cao bởi sizeof(Person).

+0

Oh vì vậy nếu tôi muốn đến mục tiếp theo, tôi sẽ sử dụng ptr + sizeof (Người)? hoặc làm "biết" để đi đến cấu trúc thứ hai khi chỉ sử dụng ptr ++ –

+1

Không. Bất cứ khi nào bạn thêm một giá trị tích phân vào một con trỏ, nó ngầm nhân giá trị bằng 'sizeof ()'. Nếu bạn thêm 1 vào một con trỏ (hoặc bằng 'ptr ++' hoặc 'ptr + n'), nó ngầm tiến lên" một trong những phần tử được trỏ tới. " Nếu bạn đã thêm 'sizeof (Person)' vào một 'Person *', nó sẽ tiến tới nhiều hơn một mục. –

+0

OH gotcha, cảm ơn. thats những gì tôi nghĩ nó đã được nhưng không chắc chắn 100%. –

2

Như John đã đề cập, nó sẽ được nâng cao bởi kích thước của chính nó - aka sizeof (Người). Tuy nhiên,

Thao tác con trỏ là điều thú vị và bạn có thể thực hiện những việc như đưa con trỏ đến một loại khác. Một khi bạn làm điều đó, số học con trỏ sẽ tiến lên bởi kích thước cơ bản của kiểu. Thông thường, bạn sẽ thấy các con trỏ được đúc thành (byte *) hoặc (unsigned char *) để cho phép truy cập byte riêng lẻ vào dữ liệu cơ bản.

+0

Thú vị, cũng cho phép nói rằng bạn muốn thăng tiến ptr để trỏ đến Jason Adams "ID" (i dunno lý do tại sao bạn muốn) nhưng chỉ ra tò mò làm thế nào bạn sẽ đi về làm điều đó? –

+0

Bạn không thể làm điều đó một cách hợp pháp và vẫn có một con trỏ tới một Person, vì 'char [15]' không phải là kiểu giống như 'Person'. –

+0

Sau đó, ý của anh ta là gì khi anh ta nói "đưa con trỏ đến một kiểu khác", xin lỗi im không phải là tốt nhất với con trỏ: ( –

0

Trước hết, bạn phải cấp phát bộ nhớ cho ptr trỏ của bạn trước khi sử dụng nó.

auto_ptr<Person> ptr(new Person); //auto_ptr for automatic freeing 

Sau đó, bạn có thể thử bên dưới mã.

strcpy(ptr->ID, "100"); //For illustraction 
int offset = ptr->ID - ptr->Name; //Get offset of ID member 
char *pID = ((char *)ptr.get())+ offset; 
//Typecast to char pointer and increment by offset to get to ID field 
cout<<pID; //Now pId can be used to access ID. 

Bạn đã hỏi cách truy cập thuộc tính ID bằng cách tăng ptr.

Như được hiển thị ở trên, bạn có thể truy cập thành viên ID của cấu trúc.

+0

Bạn không nên sử dụng 'auto_ptr', nó không được dùng trong C++ 0x. –

+0

@Adam: Ya tôi biết.Nhưng OP được gắn thẻ là C++ – bjskishore123

Các vấn đề liên quan