Objective-C 포인터
Objective-C의 포인터는 쉽고 재미있게 배울 수 있습니다. 일부 Objective-C 프로그래밍 작업은 포인터를 사용하여 더 쉽게 수행되며 동적 메모리 할당과 같은 다른 작업은 포인터를 사용하지 않고 수행 할 수 없습니다. 따라서 완벽한 Objective-C 프로그래머가되기 위해서는 포인터를 배울 필요가 있습니다. 간단하고 쉬운 단계로 학습을 시작하겠습니다.
아시다시피 모든 변수는 메모리 위치이며 모든 메모리 위치에는 메모리의 주소를 나타내는 앰퍼샌드 (&) 연산자를 사용하여 액세스 할 수있는 주소가 정의되어 있습니다. 정의 된 변수의 주소를 인쇄 할 다음 예제를 고려하십시오.
#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;
}
위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.
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
그래서 당신은 메모리 주소가 무엇이며 어떻게 접근하는지 이해 했으므로 개념의 기초는 끝났습니다. 이제 포인터가 무엇인지 살펴 보겠습니다.
포인터 란?
ㅏ pointer다른 변수의 주소, 즉 메모리 위치의 직접 주소 인 변수입니다. 다른 변수 나 상수와 마찬가지로 포인터를 사용하여 변수 주소를 저장하려면 먼저 포인터를 선언해야합니다. 포인터 변수 선언의 일반적인 형식은 다음과 같습니다.
type *var-name;
여기, type포인터의 기본 유형입니다. 유효한 Objective-C 데이터 유형이어야하며var-name포인터 변수의 이름입니다. 포인터를 선언하는 데 사용한 별표 *는 곱하기에 사용하는 것과 동일한 별표입니다. 그러나이 명령문에서 별표는 변수를 포인터로 지정하는 데 사용됩니다. 다음은 유효한 포인터 선언입니다-
int *ip; /* pointer to an integer */
double *dp; /* pointer to a double */
float *fp; /* pointer to a float */
char *ch /* pointer to a character */
정수, 부동 소수점, 문자 등 모든 포인터 값의 실제 데이터 유형은 메모리 주소를 나타내는 긴 16 진수와 동일합니다. 서로 다른 데이터 유형의 포인터 간의 유일한 차이점은 포인터가 가리키는 변수 또는 상수의 데이터 유형입니다.
포인터는 어떻게 사용하나요?
포인터의 도움으로 매우 자주 수행 할 중요한 작업은 거의 없습니다. (a) 포인터 변수를 정의합니다. (b) 변수의 주소를 포인터에 할당하고 (c)마지막으로 포인터 변수에서 사용할 수있는 주소의 값에 액세스합니다. 이것은 단항 연산자를 사용하여 수행됩니다.*피연산자가 지정한 주소에있는 변수의 값을 반환합니다. 다음 예제는 이러한 작업을 사용합니다-
#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;
}
위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.
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
Objective-C의 NULL 포인터
할당 할 정확한 주소가없는 경우 항상 NULL 값을 포인터 변수에 할당하는 것이 좋습니다. 이것은 변수 선언시 수행됩니다. NULL이 할당 된 포인터를null 바늘.
NULL 포인터는 여러 표준 라이브러리에 정의 된 값이 0 인 상수입니다. 다음 프로그램을 고려하십시오-
#import <Foundation/Foundation.h>
int main () {
int *ptr = NULL;
NSLog(@"The value of ptr is : %x\n", ptr );
return 0;
}
위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.
2013-09-13 03:21:19.447 demo[28027] The value of ptr is : 0
대부분의 운영 체제에서 해당 메모리는 운영 체제에 의해 예약되어 있으므로 프로그램은 주소 0의 메모리에 액세스 할 수 없습니다. 그러나 메모리 주소 0은 특별한 의미가 있습니다. 포인터가 액세스 가능한 메모리 위치를 가리 키도록 의도되지 않았 음을 나타냅니다. 그러나 관례 적으로 포인터에 널 (영) 값이 포함되어 있으면 아무 것도 가리키는 것으로 간주되지 않습니다.
널 포인터를 확인하려면 다음과 같이 if 문을 사용할 수 있습니다.
if(ptr) /* succeeds if p is not null */
if(!ptr) /* succeeds if p is null */
Objective-C 포인터 상세
포인터는 많지만 쉬운 개념을 가지고 있으며 Objective-C 프로그래밍에 매우 중요합니다. Objective-C 프로그래머에게 분명해야 할 몇 가지 중요한 포인터 개념이 있습니다.
Sr. 아니. | 개념 및 설명 |
---|---|
1 | Objective-C-포인터 산술 포인터에 사용할 수있는 산술 연산자는 ++,-, +,-네 가지입니다. |
2 | Objective-C-포인터 배열 여러 포인터를 보유하도록 배열을 정의 할 수 있습니다. |
삼 | Objective-C-포인터에 대한 포인터 Objective-C를 사용하면 포인터에 포인터를 둘 수 있습니다. |
4 | Objective-C의 함수에 대한 포인터 전달 참조 또는 주소로 인수를 전달하면 호출 된 함수에서 전달 된 인수를 호출 함수에서 변경할 수 있습니다. |
5 | Objective-C의 함수에서 포인터 반환 Objective-C는 함수가 지역 변수, 정적 변수 및 동적으로 할당 된 메모리에 대한 포인터를 반환 할 수 있도록합니다. |