Con trỏ Objective-C
Các con trỏ trong Objective-C rất dễ học và thú vị. Một số tác vụ lập trình Objective-C được thực hiện dễ dàng hơn với con trỏ và các tác vụ khác, chẳng hạn như cấp phát bộ nhớ động, không thể được thực hiện nếu không sử dụng con trỏ. Vì vậy, việc học các con trỏ để trở thành một lập trình viên Objective-C hoàn hảo trở nên cần thiết. Hãy bắt đầu học chúng theo các bước đơn giản và dễ dàng.
Như bạn đã biết, mọi biến là một vị trí bộ nhớ và mọi vị trí bộ nhớ đều có địa chỉ của nó được xác định có thể được truy cập bằng toán tử dấu và (&), biểu thị một địa chỉ trong bộ nhớ. Hãy xem xét ví dụ sau, sẽ in ra địa chỉ của các biến được xác định:
#import <Foundation/Foundation.h>
int main () {
int var1;
char var2[10];
NSLog(@"Address of var1 variable: %x\n", &var1 );
NSLog(@"Address of var2 variable: %x\n", &var2 );
return 0;
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả như sau:
2013-09-13 03:18:45.727 demo[17552] Address of var1 variable: 1c0843fc
2013-09-13 03:18:45.728 demo[17552] Address of var2 variable: 1c0843f0
Như vậy, bạn đã hiểu địa chỉ bộ nhớ là gì và cách truy cập nó, vậy là cơ sở của khái niệm đã kết thúc. Bây giờ chúng ta hãy xem con trỏ là gì.
Con trỏ là gì?
A pointerlà một biến có giá trị là địa chỉ của một biến khác, tức là địa chỉ trực tiếp của vị trí bộ nhớ. Giống như bất kỳ biến hoặc hằng số nào, bạn phải khai báo một con trỏ trước khi có thể sử dụng nó để lưu trữ bất kỳ địa chỉ biến nào. Dạng chung của khai báo biến con trỏ là:
type *var-name;
Đây, typelà kiểu cơ sở của con trỏ; nó phải là kiểu dữ liệu Objective-C hợp lệ vàvar-namelà tên của biến con trỏ. Dấu hoa thị * mà bạn sử dụng để khai báo một con trỏ giống với dấu hoa thị mà bạn sử dụng cho phép nhân. Tuy nhiên, trong câu lệnh này, dấu hoa thị được sử dụng để chỉ định một biến làm con trỏ. Sau đây là khai báo con trỏ hợp lệ:
int *ip; /* pointer to an integer */
double *dp; /* pointer to a double */
float *fp; /* pointer to a float */
char *ch /* pointer to a character */
Kiểu dữ liệu thực tế của giá trị của tất cả các con trỏ, cho dù là số nguyên, số thực, ký tự hay cách khác, đều giống nhau, một số thập lục phân dài đại diện cho địa chỉ bộ nhớ. Sự khác biệt duy nhất giữa các con trỏ của các kiểu dữ liệu khác nhau là kiểu dữ liệu của biến hoặc hằng số mà con trỏ trỏ tới.
Làm thế nào để sử dụng Con trỏ?
Có một số thao tác quan trọng mà chúng tôi sẽ thực hiện với sự trợ giúp của con trỏ rất thường xuyên. (a) chúng tôi xác định một biến con trỏ, (b) gán địa chỉ của một biến cho một con trỏ, và (c)cuối cùng là truy cập giá trị tại địa chỉ có sẵn trong biến con trỏ. Điều này được thực hiện bằng cách sử dụng toán tử một ngôi*trả về giá trị của biến nằm tại địa chỉ được chỉ định bởi toán hạng của nó. Ví dụ sau sử dụng các thao tác này:
#import <Foundation/Foundation.h>
int main () {
int var = 20; /* actual variable declaration */
int *ip; /* pointer variable declaration */
ip = &var; /* store address of var in pointer variable*/
NSLog(@"Address of var variable: %x\n", &var );
/* address stored in pointer variable */
NSLog(@"Address stored in ip variable: %x\n", ip );
/* access the value using the pointer */
NSLog(@"Value of *ip variable: %d\n", *ip );
return 0;
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả như sau:
2013-09-13 03:20:21.873 demo[24179] Address of var variable: 337ed41c
2013-09-13 03:20:21.873 demo[24179] Address stored in ip variable: 337ed41c
2013-09-13 03:20:21.874 demo[24179] Value of *ip variable: 20
Con trỏ NULL trong Objective-C
Việc gán giá trị NULL cho một biến con trỏ luôn là một thực tiễn tốt trong trường hợp bạn không có địa chỉ chính xác để gán. Điều này được thực hiện tại thời điểm khai báo biến. Một con trỏ được gán NULL được gọi lànull con trỏ.
Con trỏ NULL là một hằng số có giá trị bằng 0 được xác định trong một số thư viện chuẩn. Hãy xem xét chương trình sau:
#import <Foundation/Foundation.h>
int main () {
int *ptr = NULL;
NSLog(@"The value of ptr is : %x\n", ptr );
return 0;
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
2013-09-13 03:21:19.447 demo[28027] The value of ptr is : 0
Trên hầu hết các hệ điều hành, các chương trình không được phép truy cập bộ nhớ ở địa chỉ 0 vì bộ nhớ đó được hệ điều hành dành riêng. Tuy nhiên, địa chỉ bộ nhớ 0 có ý nghĩa đặc biệt; nó báo hiệu rằng con trỏ không nhằm mục đích trỏ đến vị trí bộ nhớ có thể truy cập được. Nhưng theo quy ước, nếu một con trỏ chứa giá trị null (không), nó được coi là trỏ đến không.
Để kiểm tra con trỏ null, bạn có thể sử dụng câu lệnh if như sau:
if(ptr) /* succeeds if p is not null */
if(!ptr) /* succeeds if p is null */
Chi tiết con trỏ Objective-C
Con trỏ có nhiều khái niệm nhưng dễ và chúng rất quan trọng đối với lập trình Objective-C. Có một số khái niệm con trỏ quan trọng sau đây, mà lập trình viên Objective-C phải rõ ràng -
Sr.No. | Khái niệm & Mô tả |
---|---|
1 | Objective-C - Số học con trỏ Có bốn toán tử số học có thể được sử dụng trên con trỏ: ++, -, +, - |
2 | Objective-C - Mảng con trỏ Bạn có thể xác định mảng để chứa một số con trỏ. |
3 | Objective-C - Con trỏ tới con trỏ Objective-C cho phép bạn có con trỏ trên một con trỏ, v.v. |
4 | Chuyển con trỏ đến các hàm trong Objective-C Truyền một đối số theo tham chiếu hoặc theo địa chỉ đều cho phép đối số đã truyền được thay đổi trong hàm gọi bởi hàm được gọi. |
5 | Con trỏ trả về từ các hàm trong Objective-C Objective-C cho phép một hàm trả về một con trỏ đến biến cục bộ, biến tĩnh và cả bộ nhớ được cấp phát động. |