2009-02-24 47 views
21

Có đúng không, dấu hoa thị luôn có nghĩa là "Này, đó là con trỏ!" Và một Con trỏ luôn giữ địa chỉ bộ nhớ?Asterisk * có nghĩa là gì trong Mục tiêu-C?

(Vâng, tôi biết ngoại trừ rằng một * được sử dụng cho hoạt động toán học)

Ví dụ:

NSString* myString; 

hoặc

SomeClass* thatClass; 

hoặc

(*somePointerToAStruct).myStructComponent = 5; 

Tôi cảm thấy có nhiều hơn tôi cần biết về Asterirsk (*) hơn là tôi sử dụng nó khi định nghĩa một Biến là một con trỏ tới một lớp.

Bởi vì đôi khi tôi đã nói trong khai báo tham số mà biến Tham số là một con trỏ, và tôi vẫn phải sử dụng dấu hoa thị trước biến để truy cập giá trị. Điều đó gần đây đã xảy ra sau khi tôi muốn chuyển một con trỏ của một cấu trúc đến một phương thức theo cách như [myObj myMethod: & myStruct], tôi không thể truy cập một giá trị thành phần từ cấu trúc đó mặc dù khai báo phương thức của tôi đã nói rằng có một tham số (DemoStruct *) myVar mà thực sự nên được biết đến như là một con trỏ để demostruct đó, tôi vẫn luôn luôn nói: "Man, compiler. Nghe! Nó IIISSS một con trỏ:" và viết: (* myVar) .myStructComponentX = 5;

Tôi thực sự thực sự không hiểu tại sao tôi phải nói điều đó hai lần. Và chỉ trong trường hợp này.

Khi tôi sử dụng dấu sao trong ngữ cảnh của một NSString * myString thì tôi chỉ có thể truy cập myString tuy nhiên tôi thích, mà không cần nói trình biên dịch mỗi khi nó là một con trỏ. ví dụ như sử dụng * myString = @ "yep".

Điều đó không có ý nghĩa với tôi.

+0

Đây thực sự là một câu hỏi C vì nó là không cụ thể cho Mục tiêu-C :) –

+0

trùng lặp của http://stackoverflow.com/questions/581657/why-do-i-have-to-write-mypointervar-only-sometimes-in-objective-c – philant

+1

những gì cụ thể cho Mục tiêu- C là ký hiệu @ "..." cho một đối tượng chuỗi. Trong Cocoa, lớp của các đối tượng chuỗi như vậy là NSString. – mouviciel

Trả lời

24

an * thực sự là một toán tử không tham chiếu đến con trỏ. Thời gian duy nhất nó có nghĩa là "hey tôi là một con trỏ" là trong quá trình khai báo biến.

Foo* foo // declare foo, a pointer to a Foo object 
&foo  // the memory address of foo 
*foo  // de-reference the pointer - gives the Foo object (value) 
+4

Nó không có nghĩa là bất cứ điều gì khác nhau trong quá trình khai báo - 'Foo * foo' thực sự là' Foo * foo', như trong, "' foo' là một 'Foo'". Nó hoàn toàn nhất quán. – andyvn22

+0

Có quan trọng khi bạn đặt dấu hoa thị trong khi khai báo không? Thực hành tốt là gì? (ví dụ: 'Foo * foo' và' Foo * foo') –

0

Như tôi đã nói trong my answer of your previous question, @"yep" đã là con trỏ, vì vậy không cần * trước myString cũng là một con trỏ. Trong trường hợp này, bạn gán con trỏ không phải là giá trị.

4

mmattax cũng bao gồm sự phân biệt giữa khai báo (dưới dạng con trỏ) và dereferencing.

Tuy nhiên, khi đến thời điểm về bạn:


    (*myVar).myStructComponentX = 5; 

để truy cập vào một thành viên của một thể hiện của một struct C (vì đây là) bạn có thể làm những gì bạn đã làm, hoặc phổ biến hơn bạn sử dụng -> ký hiệu :


    myVar->myStructComponentX = 5; 

Mục tiêu-C hơi khó hiểu ở đây vì gần đây (trong ObjC 2.0) giới thiệu sở hữu cú pháp, đó là một vết cắt ngắn cho:


    int val = [myObject someIntProperty]; 

và bây giờ có thể được viết như sau:


    int val = myObject.someIntProperty; 

Đây là Objective C (2.0) Cú pháp để truy cập vào một tài sản mà bạn đã khai báo (không phải là biến thành viên thực tế), trong khi ví dụ của bạn đã truy cập vào một thành viên của cấu trúc C.

Đảm bảo bạn hiểu rõ sự khác biệt.