'pointer'에 해당되는 글 4건

  1. 2010.07.18 Pointer and Array
  2. 2010.07.18 Pointer와 함수
  3. 2010.07.18 Pointer와 구조체
  4. 2010.07.18 Pointer
Objective C/C언어 기능2010. 7. 18. 12:57


 배열은 포인터이고 배열의 이름은 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 버터백통
Objective C/C언어 기능2010. 7. 18. 12:45

인수값을 포인터로 받는 함수. 실제로 값을 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 버터백통
Objective C/C언어 기능2010. 7. 18. 12:41

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 버터백통
Objective C/C언어 기능2010. 7. 18. 12:39


***** 포인터

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 버터백통