Programming/자료구조
[자료구조] 08. 포인터
happy_jinsu
2021. 10. 27. 00:01
※ 사전 지식
변수 : 이름(name) / 값(value) / 주소 값(address)을 가짐.
포인터(Pointer)
▶ 다른 변수의 주소를 가지고 있는 변수.
int a = 10;
int *p;
p = &a; //포인터 변수의 초기화
▷ p : 포인터 변수. p의 값은 주소값. 해당 주소에 실제 위치한 값이 int. (p의 값으로 a의 주소 값 할당)
▶ 포인터가 가리키는 값의 변경 : * 연산자 사용. (역참조)
▷ 역참조 : p값인 주소값이 실제로 갖는 값을 가져옴.
▷ 변수 a의 값을 직접 변경하지 않아도 포인터 변수 p의 역참조를 통해 a의 값을 변경할 수 있음.
int a = 100;
int *p = &a; // a의 주소값을 이용해 포인터 변수 p의 값을 초기화
*p = 200; // 변수 a의 값을 포인터 변수의 역참조를 이용해서 변경
▶ 포인터 종류
int *p; // p는 정수형 변수를 가리키는 포인터
float *pf; // pf는 실수형 변수를 가리키는 포인터
char *pc; // pc는 문자형 변수를 가리키는 포인터
▷ p, pf, pc 모두 포인터 변수로, 값은 주소값이 저장된다. 차이점은 각각 변수의 자료형이 다르다는 것이다.
▶ 포인터 활용 예시
#include <stdio.h>
void swap(int *, int *);
int main(void)
{
int a = 100, b = 200;
printf("swap 호출 전 : a = %d, b = %d\n", a, b); // a = 100, b = 200
swap(&a, &b);
printf("swap 호출 후 : a = %d, b = %d\n", a, b); // a = 200, b = 100
return 0;
}
void swap(int *x, int *y) // x,y는 포인터 변수.(= 주소값) x,y의 주소값에 있는 값들이 서로 switch 됨.
{
int tmp;
tmp = *x;
*x = *y;
*y = tmp; //정수형 값에 주소값을 넣으면 안됨. ( tmp = x 안됨. *x로 넣어주기.)
}
▶ 배열에서 포인터의 사용
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define SIZE 6
void get_integers(int[]);
int cal_sum(int[]);
int main(void)
{
int list[SIZE];
get_integers(list); // 배열 이름 넣기. (= 배열 첫번째 원소의 주소값)
printf("sum = %d \n", cal_sum(list)); // cal_sum(&list[0])으로 해도 됨.
return 0;
}
//정수 입력을 받아 정수형 배열에 값 넣기.
void get_integers(int list[])
{
int i;
printf("Enter 6 integers: ");
for (i = 0; i < SIZE; i++)
{
scanf("%d", &list[i]);
}
}
//정수 배열의 각 요소들을 더한 합을 반환.
int cal_sum(int list[])
{
int i,sum = 0;
for (i = 0; i < SIZE; i++)
{
sum += *(list + i); //역참조
}
return sum;
}
▷ 배열의 이름 : 포인터와 같은 역할. 배열 첫 번째 원소의 주소 값. (=배열의 시작 주소 값)
참고 서적 : <C언어로 쉽게 풀어쓴 자료구조>