혼자 공부하는 C언어(개정판) 6주차

2023. 8. 14. 01:00C언어/혼공학습단 10기

728x90

혼공단 - 혼공C, 혼자 공부하는 C언어 개정판

 

# 진도 기본 미션 선택 미션
6주차
(8/14 ~ 8/20)
Chapter 09 포인터의 핵심 내용을 정리하고 공유하기 Ch.09 도전 실전 예제(p.289) 풀고 인증하기

 

■ 혼공학습단 간식

 : 주변에 EDIYA가 없어서 한동안 쓰지를 못하다가, 발견한 곳에서는 샌드위치가 없어 추가금 내고 시원한 아아로 교환했습니다.

   → MEGA도 다음날 시원하게 잘 마셨습니다. 공부만 해도 간식이 저절로 굴러들어 오는 혼공단 👍

 

 

■ 기본 미션

: 포인터의 핵심 내용을 정리하고 공유하기

  → Chapter의 '학습목표'를 바탕으로 내용을 정리했습니다.

 

 

□ Chapter 09

시스템 프로그래밍이 가능하도록 도와주는 포인터의 개념
 - 포인터: 메모리의 주소(변수가 할당된 메모리 공간의 시작 주소) 값을 이용해 메모리에 접근
  . 포인터는 주소 값을 저장하는 또 다른 메모리 공간으로 그 크기는 주소의 크기와 동일
    → 주소와 포인터는 각각 상수와 변수라는 차이 존재

구분 사용 예 기능
포인터 char *pc;
int *pi;
double *pd;
시작 주소 값을 저장하는 변수며, 가리키는 자료형을 표시해 선언


메모리 주소의 개념과 주소 연산자 &, 간접 참조 연산자 *
 - 메모리: 데이터를 넣고 꺼내 쓰는 공간
  . 메모리 주소: 메모리상 데이터의 위치를 식별할 수 있는 값으로 보통 해당 데이터의 시작 위치를 주소값으로 가짐
    → 바이트 단위로 구분: 0부터 시작하고 바이트 단위로 1씩 증가하므로, 2바이트 이상 크기의 변수는 여러 개의 주소 값에 걸쳐 할당
 - 주소 연산자(&): 변수의 주소를 구할 때 사용하는 연산자 (변수의 이름 앞에 사용하여, 해당 변수의 주소값을 반환)
  . 주소를 구할 때 사용하는 연산자로 포인터에 이 주소값을 저장해 해당 메모리에 접근할 수도 있고, scanf에서 사용할 때처럼 함수에 메모리 주소를 전달하는 용도로 사용도 가능 (비트 연산자 &와 헷갈리지 않도록 주의)
 - 간접 참조 연산자(*): 포인터가 가리키는 변수를 사용할 때 포인터에 사용하는 특별한 연산자
  . 포인터의 이름이나 주소 앞에 사용하여, 포인터에 가리키는 주소에 저장된 값을 반환
 ※ &는 앰퍼샌드(ampersand), *는 애스터리스크(asterisk)라고 읽음

구분 사용 예 기능
주소 연산자 int a;
&a;
변수 앞에 붙여 사용하며, 변수가 할당된 메모리의 시작 주소 값을 구함
간접 참조 연산자 *pi = 10; 포인터에 사용하며, 포인터가 가리키는 변수를 사용


포인터 기본 사용법과 포인터 사용 규칙
 - 포인터는 주소를 저장하는 변수로 일반 변수와 마찬가지로 선언 후에 사용
  . 포인터의 주요 기능 중 하나는 함수 간에 효과적으로 데이터를 공유하는 것 (두 변수의 값을 교환)
 - 포인터 사용 이유: 임베디드 프로그래밍을 할 때 메모리에 직접 접근하는 경우나 동적 할당한 메모리를 사용하는 경우에 필요
  . 임베디드 프로그래밍: 임베디드 시스템을 제어하기 위한 프로그램으로, 하드웨어를 제어하는 소프트웨어를 만드는 일

구분 사용 예 기능
포인터 int a, b; int *p = &a; p = &b; 포인터는 변수이므로 그 값을 다른 주소로 변경 가능
포인터의 크기 int *p; sizeof(p) 포인터의 크기는 컴파일러에 따라 다를 수 있으며, sizeof 연산자로 확인


 - 포인터의 대입 규칙
  ① 포인터는 가리키는 변수의 형태가 같을 때만 대입
    . 가리키는 자료형이 일치하지 않는 포인터의 대입을 시도하면 컴파일러는 경고 메시지를 표시
  ② 형 변환을 사용한 포인터의 대입은 가능
    . 포인터가 가리키는 자료형이 다른 경우라도 형 변환 연산자를 사용하면 경고 메시지 없이 대입 가능하지만 사용에는 문제 없어야 함

 

 

■ 선택 미션

: Ch.09 도전 실전 예제(p.289) 풀고 인증하기

  → 미니 정렬 프로그램: 키보드로 실수 3개를 입력한 후 큰 숫자부터 작은 숫자로 정렬한 뒤 출력하는 프로그램

    - 중간값과 최소값, 중간값과 최대값, 최소값과 최대값을 비교해서 swap() 진행

#include <stdio.h>

void swap(double *pa, double *pb);
void line_up(double *maxp, double *midp, double *minp);

int main(void)
{
	double max, mid, min;

	printf("실수값 3개 입력 : ");
	scanf("%lf%lf%lf", &max, &mid, &min);
	line_up(&max, &mid, &min);
	printf("정렬된 값 출력 : %.1lf, %.1lf, %.1lf\n", max, mid, min);
	
	return 0;
}

void swap(double *pa, double *pb)
{
	double temp;

	temp = *pa;
	*pa = *pb;
	*pb = temp;
}

void line_up(double *maxp, double *midp, double *minp)
{
	if (*minp > *midp)
	{
		swap(minp, midp);
	}
	if (*midp > *maxp)
	{
		swap(midp, maxp);
	}
	if (*minp > *maxp)
	{
		swap(minp, maxp);
	}
}

 

728x90