본문 바로가기

Layer7/동아리 숙제

C언어 pointer

● Pointer란?

   ○ Pointer의 특징

● 포인터의 연산

● Pointer의 활용

● 포인터 처리 방식

 

-----------------------------------------------------------------------

 

▶ Pointer란?

더보기

   · C언어만의 독창적인 기능

   · 변수를 직접 사용하기 때문에 해킹할때 많이 쓰임

   ▷ Pointer의 특징

      · Pointer는 기존의 Call By Value 방식이 아닌

        Call By Reference방식을 사용함으로써 변수의 주소값을 직접 가져와 그 변수값을 사용한다.

Call By Value, Call By Reference 예제)

#include <stdio.h> 
#include <stdlib.h> 

void CallByValue(int x, int y); 
void CallByReference(int *x, int *y); 

int main(){ 
int x, y; 
x = 1; y = 2; 
printf("============================\n"); 
printf("\tCallByValue\n"); 

printf("Before\n"); 
printf("x: %d, y: %d\n", x, y); 
CallByValue(x, y); 
printf("After\n"); 
printf("x: %d, y: %d\n", x, y); 
printf("============================\n\n\n"); 

//---------------------------------------------------- 

printf("============================\n"); 
printf("\tCallByReference\n"); 

printf("Before\n"); 
printf("x: %d, y: %d\n", x, y); 
CallByReference(&x, &y); 
printf("After\n"); 
printf("x: %d, y: %d\n", x, y); 
printf("============================\n"); 

    return 0 ; 
} 

void CallByValue(int x, int y) 
{ 
int tmp; 
tmp = x; 
x = y; 
y = tmp; 
} 

void CallByReference(int *x, int *y) 
{ 
int tmp; 
tmp = *x; 
*x = *y; 
*y = tmp; 
}

#include <stdio.h> 
#include <stdlib.h> 

void CallByValue(int x, int y); 
void CallByReference(int *x, int *y); 

int main(){ 
int x, y; 
x = 1; y = 2; 
printf("============================\n"); 
printf("\tCallByValue\n"); 

printf("Before\n"); 
printf("x: %d, y: %d\n", x, y); 
CallByValue(x, y); 
printf("After\n"); 
printf("x: %d, y: %d\n", x, y); 
printf("============================\n\n\n"); 

//---------------------------------------------------- 

printf("============================\n"); 
printf("\tCallByReference\n"); 

printf("Before\n"); 
printf("x: %d, y: %d\n", x, y); 
CallByReference(&x, &y); 
printf("After\n"); 
printf("x: %d, y: %d\n", x, y); 
printf("============================\n"); 

    return 0 ; 
} 

void CallByValue(int x, int y) 
{ 
int tmp; 
tmp = x; 
x = y; 
y = tmp; 
} 

void CallByReference(int *x, int *y) 
{ 
int tmp; 
tmp = *x; 
*x = *y; 
*y = tmp; 
}

 

포인터의 연산

더보기

   · 포인터의 연산은 일반 연산처럼 +, -기호를 사용한다.

   · 그러나 포인터는 연산을 할 때 일반 연산과 차이점을 보인다.

      · 쉬운 예를 위해 두개의 포인터 int x(00000000), int y(00000005)의 연산을 알아보겠다. (주소값)

         · +인 경우 (x = y + 1)

           x의 출력값은 00000006가 아닌 00000009가 된다.

           이유는 일반 연산처럼 그냥 +1을 더해주는 것이 아닌 '포인터 자료형의 크기만큼 1번 더해준다'라는 뜻이기                 때문이다.

           그래서 결론적으론 +4가 되니, 00000005 + 00000004를 해준 00000009가 x에 대입되는 것이다.

         · -인 경우 (x = y - 1)

           x의 출력값은 00000004가 아닌 00000001이 된다.

           이유는 일반 연산처럼 그냥 -1을 빼주는 것이 아닌 '포인터 자료형의 크기만큼 1번 빼준다'라는 뜻이기

           때문이다.

           그래서 결론적으론 -4가 되니, 00000005 - 00000004를 해준 00000001이 x에 대입되는 것이다.

         · 추가적으로

            · +는 순방향으로 이동하고

              -는 역방향으로 이동한다.

            · 곱하기와 나누기는 컴파일 에러가 일어난다.

            · +2일 경우에는 +1과 다르게

              + (포인터 자료형의 크기 * 숫자) 이니

              + (4 * 2) => +8이 된다. (빼기도 마찬가지)

 

 Pointer의 활용

더보기

   · 변수의 값을 '직접' 사용하기 때문에

      1) 구조체에서 메모리 관리가 수월해 진다.

      2) 배열을 동적할당 할 수 있다.

      3) 함수를 사용할때 작업하기 정말 편해진다. 등등

 

 포인터 처리 방식

더보기

   · 포인터의 문자열 처리방식

      1) 문자열의 주소만 가리키고 있기 때문에 해당 문자열 수정 불가능

      2) 중간의 해당 문자열 주소가 아닌 다른 문자열 주소를 가질 수 있음 (배열은 불가능)

      3) 문자열을 입력받기 위해서는 메모리 공간이 할당 되어야 한다.