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로 넣어주기.)
}

 

swap 함수
swap함수에서 나온 후, main 함수


▶ 배열에서 포인터의 사용

#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언어로 쉽게 풀어쓴 자료구조>