포인터란?
- 동적 메모리 할당(dynamic memory allocation)과도 같은 기능을 더 쉽게 수행할 수 있도록 마련된 방안
- 포인터는 다른 변수의 메모리 상의 주소를 담고있는 주소를 담고있는 변수
- 포인터 정보 = 해당 데이터의 메모리 주소 + 메모리를 차지하는 크기
- 이 두 정보만 있으면 데이터의 정확한 위치를 알 수 있다
04번에서 시작하는데 길이는 3이야 -> 저장소 위치: 04-05-06
메모리 주소
- 모든 변수는 &연산자(ampersand operator)로 접근 가능한 메모리 주소가 할당되어 있다
#import <Foundation/Foundation.h>
int main () {
int var1;
char var2[10];
NSLog(@"Address of var1 variable: %x\n", &var1 );
/* Address of var1 variable: 9d290630 */
NSLog(@"Address of var2 variable: %x\n", &var2 );
/* Address of var2 variable: 9d290636 */
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
- var1에 할당된 주소는 1c0843fc, var2는 1c0843f0인 걸 확인할 수 있다
포인터의 데이터 타입
type *pointer-variable-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진수로 모두 동일하다
포인터 사용법
- 포인터 변수 정의하기
- 포인터에 특정 변수의 메모리 주소 할당하기
- 포인터가 가리키는 주소에 저장된 변수를 반환하는 *연산자를 통해, 포인터에 담긴 주소로 넘어가 변수에 접근하기
예시: int 타입의 변수 NumVar의 주소를 가리키는 포인터 변수 활용하기
#import <Foundation/Foundation.h>
int main () {
int NumVar = 20; /* int 데이터 타입의 변수 선언 */
int *ip; /* 포인터 변수 선언 */
ip = &NumVar; /* 포인터 변수에 int 변수의 주소 할당 */
/* a. 변수 NumVar의 메모리 주소 출력 */
NSLog(@"Address of NumVar variable: %x\n", &NumVar ); /* Address of var variable: 3a3002c */
/* b. 포인터 변수 ip에 저장되어 있는 주소 출력 */
NSLog(@"Address stored in ip variable: %x\n", ip ); /* Address stored in ip variable: 3a3002c */
/* a와 b가 같은 16진수 값을 출력함 */
/* c. 포인터로 할당된 값 접근 */
NSLog(@"Value of *ip variable: %d\n", *ip ); /* Value of *ip variable: 20 */
return 0;
}
Reference