'pointer'에 해당되는 글 4건

  1. 2010.07.18 Pointer and Array
  2. 2010.07.18 Pointer와 함수
  3. 2010.07.18 Pointer와 구조체
  4. 2010.07.18 Pointer


 배열은 포인터이고 배열의 이름은 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번째 원소의 값을 출력

신고
Posted by 정윤수 버터백통
TAG Array, pointer

인수값을 포인터로 받는 함수. 실제로 값을 deep copy하여 새로운 연산을 하는 것이 아니고 편의상 함수로 연산 부분을 따로 만들어 제공한다. 개인적으로는 많이 사용하게 된다.


/*

 넘어온 포인터가 가리키는 값을 서로 바꾸어 준다.

*/ 

void exchage( int * pint1, int * pint2 )

{

int temp;

temp = *pint1;

*pint1 = *pint2;

*pint2 = temp;

}



int main (int argc, const char * argv[]) {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

//좋은 습관을 위해 함수선언부를 프로그램 초반에 설정하여 컴파일러에게 알린다.

int exchage(<#int * pint1#>, <#int * pint2#>);

int a=-10, b=10, * intPa = &a, * intPb = &b;

NSLog(@"a=%i, b=%i, intPa=%i, intPb=%i", a, b, *intPa, *intPb);

//함수에 포인터를 인수로 넘긴다.

exchage(intPa, intPb);

NSLog(@"a=%i, b=%i, intPa=%i, intPb=%i", a, b, *intPa, *intPb);

//함수에 주소지를 넘긴다. 주소지=포인터

exchage(&a, &b);

NSLog(@"a=%i, b=%i, intPa=%i, intPb=%i", a, b, *intPa, *intPb);

[pool drain];

    return 0;

}


신고
Posted by 정윤수 버터백통

struct date {

int month;

int day;

int year;

};

struct date today;

struct date * datePtoday;

datePtoday = &today;

/*

간접 참조 연산자(*)보다 멤버연산자(.) 우선순위 이므로

소괄호를 사용하여 참조연산자 부터 실행하도록 한다.

*/ 

(*datePtoday).month = 6;

(*datePtoday).day = 10;

(*datePtoday).year = 2010;

NSLog(@"%i-%i-%i", today.month, today.day, today.year);

NSLog(@"%i-%i-%i", (*datePtoday).month, (*datePtoday).day, (*datePtoday).year);

//구조체 속성에 접근하는 새로운 방법 ->연산자. -> 통해 주소지에 저장된 값을 참조한다.

datePtoday->month = 7;

datePtoday->day = 25;

datePtoday->year = 2010;

    NSLog(@"%i-%i-%i", datePtoday->month, datePtoday->day, datePtoday->year);


신고
Posted by 정윤수 버터백통


***** 포인터

1 포인터는 메모리의 주소값을 저장하기 위한 4바이트 변수(포인터의 크기가 4바이트인 이유는 32비트 컴퓨터의 주소체계가 32비트(4바이트)이기 때문)이다.

2 포인터 변수도 메모리에 할당된다.

3 & 주소연산자로서 변수의 주소지를 알아낸다.

4 * 메모리에 들어있는 값을 알아낸다.


앞서 scanf("%i" , &num);

경우 scanf뒤에 있는 &num num이라는 변수의 주소지를 담는 포인터를 선언한 것이며 

주소지를 참조하여 값을 간접적으로 저장한 것이다.

(일반 변수에 주소지만 저장하면 4바이트 참조 경로가 아닌 정말 주소지의 값만 저장되므로 나중에 참조 없다.)

 

변수 i 담긴 5 4바이트에 걸쳐 이루어진 값이다.

포인터 pi 담긴 값은 i 주소지의 시작값이고 그로부터 4바이트를 

참조하여 i 값을 알아낼 있다.

int i = 5;

int * pi = &i;

NSLog(@"%d %d", i, &i);

//5 -1073744472

/*

5 : i

-1073744472 : i 주소지

*/ 

NSLog(@"%d %d %d", pi, &pi, *pi);

//-1073744472 -1073744476 5

/*

-1073744472 : i 주소지를 담고있는 pi

-1073744476 : pi 주소지

5 : pi 담긴 주소지를 통해 들어간 i

*/ 

신고
Posted by 정윤수 버터백통
TAG pointer