2023. 8. 14. 01:00ㆍC언어/혼공학습단 10기
혼공단 - 혼공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);
}
}
'C언어 > 혼공학습단 10기' 카테고리의 다른 글
혼공학습단 10기 활동 회고: 혼공C(개정판) 혼공족 이야기 (1) | 2023.08.17 |
---|---|
혼자 공부하는 C언어(개정판) 5주차 (0) | 2023.08.10 |
혼자 공부하는 C언어(개정판) 4주차 (0) | 2023.07.24 |
혼자 공부하는 C언어(개정판) 3주차 (0) | 2023.07.19 |
혼자 공부하는 C언어(개정판) 2주차 (2) | 2023.07.12 |