C - 포인터

2022. 3. 6. 18:35C

포인터란 ? 

자료형 *포인터변수명 = &변수;

 

메모리의 구조

- 변수는 메모리에 저장된다.

- 메모리는 바이트 단위로 액세스 된다.

  첫번째 바이트의 주소는 0, 두번째 바이트의 주소는 1 ....

 

포인터는 변수 값의 주소를 가리킨다.

컴퓨터가 변수를 기억하기 위해선 메모리 공간이 필요한데, 이때 포인터는 이 메모리 공간의 주소를 가리킴

 

간접 참조 연산자 * : 포인터가 가리키는 값을 가져오는 연산자 

int i = 10;
int *p=&i;
printf("%d\n", *p);
*p = 20;
printf("%d\n", *p);

출력 결과

10
20

위 예제를 보면 포인터가 가리키는 주소안의 값이 출력이 되는 것을 확인할 수 있고, 

int a = 10;
int *ptr = &a;
printf("ptr의 값 : %p\n", ptr);
printf("ptr이 가리키는 주소 안의 값 : %d",*ptr);
return 0;

출력 결과

ptr의 값 : 0x3057389f8
ptr이 가리키는 주소 안의 값 : 10

변수앞에 *을 붙여주면 주소안의 값이 나온다.

 

포인터 사용 예제

int a = 10;
int *ptr = &a;
printf("a의 값 : %d\n", a);
printf("a의 주소값 : %p\n", &a);
printf("ptr의 값 : %d\n", *ptr);
printf("ptr의 주소값 : %p\n\n", ptr);

*ptr = 20;
printf("a의 값 : %d\n", a);
printf("a의 주소값 : %p\n", &a);
printf("ptr의 값 : %d\n", *ptr);
printf("ptr의 주소값 : %p\n\n", ptr);

출력 결과

a의 값 : 10
a의 주소값 : 0x30d20f9fc
ptr의 값 : 10
ptr의 주소값 : 0x30d20f9fc

a의 값 : 20
a의 주소값 : 0x30d20f9fc
ptr의 값 : 20
ptr의 주소값 : 0x30d20f9fc

위 코드를 보면 주소값을 복사해오기 때문에 주소 자체에 접근해서 값을 바꾸면 원본 값까지 변경 되는 것을 확인할 수 있다.

 

*주의 사항

1.포인터는 가급적 선언과 초기화를 같이 해주는 것이 좋다

//나쁜 예시
int a = 10;
int *ptr;
*ptr = 20;
//좋은 예시
int a = 10;
int *ptr = &a;
*ptr = 100;

2.포인터 선언시 초기화 안하려면, NULL로 초기화 !!

int a = 10;
int *ptr = NULL;
ptr = &a;

3.포인터의 타입과 변수의 타입은 일치하여야 한다. (형변환을 이용해 처리할 순 있긴하다)

int i;
double *pd;
pd = (double*)&i;

형변환시 큰 자료형 -> 작은 자료형으로 가능은 하나 반대의 경우는 불가능

 

 

두 변수의 값을 서로 변환하는 포인터 함수

void swap(int *x, int *y) {
    int temp;
    temp = *x;
    *x = *y;
    *y = temp;
}

int main() {
    int x = 1;
    int y = 2;
    swap(&x,&y);
    printf("x= %d \ny= %d\n", x, y);
    return 0;
}

출력 결과

x= 2 
y= 1

 

포인터를 이용해 i값을 바꿔주는 프로그램

int i = 10;
int *p;
p = &i;
printf("i = %d\n", i );
*p = 20;
printf("i = %d\n", i );
return 0;

출력 결과

i = 10
i = 20

 

*포인터 연산시 증가 연산의 경우 증가되는 값은 포인터가 가리키는 객체의 크기이다.

포인터 타입 ++연산 후 증가되는 값
char 1
short 2
int  4
float 4
double 8

 

'C' 카테고리의 다른 글

C - getchar() 함수와 gets()함수  (0) 2022.03.07
C - 배열  (0) 2022.03.06
C - 반복문 예제  (0) 2022.02.25
C - 반복문  (0) 2022.02.20
C - 조건문  (0) 2022.02.20