배열은 포인터이고 배열의 이름은 0번째 원소의 주소지를 가리킨다.
또한 배열의 이름은 언제나 0번째 원소를 가라키는 변경불가능한 상수이다.
ex) ary[] = {1,2,3,4,5};
ary = &ary[0];//배열의 0번째 주소지를 표현
*ary = 1; //0번째 주소지의 값을 표현
반면 포인터는 언제나 주소지를 변경할 수 있는 변수이다.
int a[5] = {1,2,3,4,5};
NSLog(@"*a=%i",*a);
int * pa;
pa = a;//또는 pa = &a[0];
NSLog(@"a[0] = %d a[1] = %d a[2] = %d a[3] = %d a[4] = %d",a[0],a[1],a[2],a[3],a[4]);
NSLog(@"pa[0] = %d pa[1] = %d pa[2] = %d pa[3] = %d pa[4] = %d",pa[0],pa[1],pa[2],pa[3],pa[4]);
int b[] = {6,7,8,9,10};
pa = b;
NSLog(@"pa[0] = %d pa[1] = %d pa[2] = %d pa[3] = %d pa[4] = %d",pa[0],pa[1],pa[2],pa[3],pa[4]);
NSLog(@"**************************************************************");
/*
**** 포인터의 연산
1) 포인터가 가리키는 값을 증가 혹은 감소시키는 연산
2) 포인터가 가리키는 대상원소를 증가 또는 감소 : 자료형의 크기만큼 증가한다.
예) int는 4바이트 만큼 증가
char형도 자료형의 크기만큼 1바이트 증가
double형은 8바이트 만큼 증가
*/
int * ptr1;
char * ptr2;
double * ptr3;
NSLog(@"ptr1번지=%d, ptr2번지=%d, ptr3번지=%d, ", ptr1, ptr2, ptr3);
//ptr1번지=0, ptr2번지=0, ptr3번지=0, : 초기값을 주지 않아 전부 0으로 보여진다.
NSLog(@"ptr1번지=%d, ptr2번지=%d, ptr3번지=%d, ", ptr1++, ptr2++, ptr3++);
//ptr1번지=0, ptr2번지=0, ptr3번지=0: 마찬가지로 초기값이 없어 0이지만 각 증가 값은 다르다
/*
int는 4바이트 만큼 증가
char형도 자료형의 크기만큼 1바이트 증가
double형은 8바이트 만큼 증가한 것이다.
*/
//마지막에 null문자인 \0을 삽입하여 원소마지막을 알림
char arry[6] = {'K','o','r','e', 'a', '\0'};
char * p_arry = arry;
NSLog(@"memory address = %x", p_arry);
NSLog(@"*p_arry = %c", *p_arry);
//K를 출력 : 0번때 우너소의 값을 출력
NSLog(@"*(++p_arry) = %c", *(++p_arry));
//o를 출력 : 0번째원소에서 ++에 의해 포인터는 1번째 원소를 가리킴
NSLog(@"*(++p_arry) = %c", *(++p_arry));
//r를 출력 : 1번째 원소를 가리키는 중 ++ 에의해 2번째 원소를 가리킴
NSLog(@"*(p_arry+1) = %c", *(p_arry + 1));
//e를 출력 : 2번째 원소(r)를 가리키나 + 1에 의해 다음 원소의 값을 출력
NSLog(@"*(p_arry+2) = %c", *(p_arry + 2));
//a를 출력 : 2번째 원소(r)를 가리키나 + 2에 의해 4번째 원소의 값을 출력