책 소개
요약
기존 프로그래밍 교육은 완성된 예제 코드를 무작정 따라하게 하면서 단편적 지식만 전달하는 방식이며, 학습 난이도와 무관하게 항목별로 목차를 단순히 ‘나열’했기 때문에 프로그래밍 전체 흐름을 이해하기 전에 중반에 배치된 배열, 포인터 변수 등 어려운 이론이 등장할 때마다 난관에 직면하게 되는 구조적 결함이 있었다. 따라서 코드를 조금만 변경해도 이해하지 못하고, 빌드도 제대로 못하고, 새로운 기능을 구현하기 위한 코드를 직접 구현하는 능력을 기르기 전에 결국 프로그래밍을 포기하는 수많은 ‘프포자(프로그래밍을 포기한 자)’를 만들어냈다.
핵심 코드 한줄부터 프로그래밍을 시작해 살을 붙여가며, 수많은 에러를 해결해가면서 ‘코드가 완성되는 과정’을 이해할 때 프로그래밍을 몸으로 ‘체득’하게 되며, 실무에 투입될 수 있는 프로그래머로 성장할 수 있는 최소한의 기반이 마련된다. 진정한 프로그래머를 육성하기 위해서, 난이도에 따라 여러 챕터(장)로 분산 배치하는 ‘나선형 목차’를 통해 새로운 프로그래밍 교육 방식을 제안한다.
이 책에서 다루는 내용
◆ 프로그래밍의 개요와 C 프로그래밍의 개요
◆ C 프로그래밍의 전체 구조와 흐름
◆ 난이도에 따라 나선형으로 분산된 C 프로그래밍 이론(개념, 구조와 흐름, 기본, 응용)
◆ 완성된 코드를 분석하는 것이 아닌 직접 프로그래밍할 수 있는 힘을 기르는 방법
이 책의 대상 독자
◆ 다양한 프로그래밍 교재를 보고 학습했음에도 프로그래밍을 포기했던 ‘프포자’
◆ 인생 처음으로 프로그래밍 언어를 배우고자 하는 누구나
◆ 프로그래머 지망생, 프로그래밍 전공 또는 관련 학과/학부 학생
◆ 절차적 프로그래밍부터 기초를 잡고 객체 지향 프로그래밍으로 넘어가고자 하는 자
이 책의 구성
1장. C 프로그래밍의 개념에서는 전반적인 프로그래밍의 개요, C 프로그래밍의 개요를 살펴본다. 책을 펴자마자 무작정 코드를 작성하기보다 프로그래밍이란 무엇인지라는 기초적인 개념부터 살펴보는 것으로 스스로 왜 프로그래밍을 배우는지 충분히 납득한 상태에서 프로그래밍에 첫발을 디디게 될 것이다. 다음으로 프로그래밍 실습을 위한 환경을 구축하기 위해 컴파일러를 준비하는 과정을 다룬다.
2장. C 프로그래밍의 구조와 흐름에서는 C 프로그래밍의 전체적인 구조와 프로그래밍이 진행되는 흐름을 살펴본다. 프로그래밍의 구조와 흐름을 이해하기 위해 필요한 최소한의 이론만 가볍게 소개하면서 C 프로그래밍이라는 전체적인 한 장의 그림을 그리게 된다. 프로그래밍의 기본 단위와 시작점, 기초 개념, 기본 구조와 흐름을 배운 뒤 실무에서 사용되는 확장성을 고려한 프로그래밍 구조를 알아본다. 이 책에서는 기존 프로그래밍 교재들과 달리 첫 예제부터 실무에서도 활용되는 구조를 기반으로 예제 코드를 작성할 것이다. 마지막으로 프로그래밍은 현재 진행형의 의미를 갖고 있으므로 에러, 경고, 버그가 발생했을 때 스스로 수정할 수 있어야 한다는 것을 전제로 한다. 따라서 문제를 해결하기 위한 필수적 수단인 디버깅을 알아본다.
3장. C 프로그래밍의 기본에서는 C 프로그래밍 언어를 이해하기 위한 기본 이론을 논리적인 흐름에 따라 15개의 절로 나눠 배운다. 3장은 프로그래밍의 시작부터 끝까지 흐름 자체를 이해할 수 있게 세부적으로 다섯 부분으로 구성했다.
4장. C 프로그래밍의 응용에서는 3장을 학습하는 시점을 기준으로 난이도가 높아 3장에서 학습하는 것이 비효율적이라 뒤로 미뤄뒀던 응용 이론을 다룬다. 응용 이론은 2개 이상의 이론이 복합적으로 다뤄지므로 3장에서 기본 이론을 모두 이해한 후에 학습해야 비로소 쉽게 이해된다.
목차
목차
- 1장. C 프로그래밍의 개념
- 1-1 프로그래밍 개요
- 1-1-1 프로그래밍을 배운다는 의미
- 1-1-1-1 프로그래밍은 영어를 체득하는 과정과 동일하다
- 1-1-1-2 이론과 실습보다 개념이 우선돼야 한다
- 1-1-2 프로그래밍 언어, 프로그래밍, 코딩
- 1-1-3 프로그래밍 = 데이터 + 알고리듬
- 1-1-4 절차적 프로그래밍 vs 객체지향 프로그래밍
- 1-1-4-1 철학부터 다른 별개의 언어
- 1-1-4-2 절차적 프로그래밍
- 1-1-4-3 객체지향 프로그래밍
- 1-1-4-4 C를 먼저 배워야 하는 이유
- 1-1-5 표준 라이브러리와 사용자 정의
- 1-2 C 프로그래밍 개요
- 1-2-1 C 프로그래밍 언어 소개
- 1-2-1-1 C 프로그래밍 언어의 탄생
- 1-2-1-2 C 프로그래밍 언어의 표준
- 1-2-2 C 프로그래밍 언어의 특징
- 1-2-2-1 프로그래머(인간) 지향성
- 1-2-2-2 메모리와 하드웨어를 직접 제어 가능
- 1-2-2-3 높은 이식성
- 1-2-3 C 프로그래밍의 꽃은 포인터 변수가 아닌 ‘함수’여야 한다
- 1-2-4 C 프로그래밍을 수행하는 7단계
- 1-2-4-1 프로그래밍의 시작은 논리적 사고부터
- 1-2-4-2 C 프로그래밍의 7가지 수행 단계
- 1-3 실습을 위한 컴파일러 준비
- 1-3-1 비주얼 스튜디오 다운로드 및 설치
- 1-3-2 솔루션 및 프로젝트 생성
- 1-3-2-1 비주얼 스튜디오의 구조
- 1-3-2-2 프로젝트 생성
- 1-3-3 소스 파일 생성
- 1-3-4 코드 작성
- 1-3-5 컴파일과 솔루션 빌드
- 1-3-6 실행 파일 실행
- 1-3-7 C 프로그래밍의 시작점: main 함수
- 1-3-8 비주얼 스튜디오 추천 단축키
- 2장 C 프로그래밍의 구조와 흐름
- 2-1 프로그래밍을 하는 기본 단위와 시작점
- 2-1-1 프로그램, 함수, 명령문
- 2-1-2 키워드와 식별자
- 2-1-3 main 함수의 C99 표준 작성법
- 2-1-4 컴파일러가 인식하는 명령문의 종료
- 2-1-4-1 에러 코드: C2143
- 2-2 프로그래밍에 필요한 기초 개념
- 2-2-1 표준 라이브러리 함수
- 2-2-2 전처리기 지시자: #include
- 2-2-2-1 윈도우 API 활용
- 2-2-3 데이터형의 기본 분류
- 2-3 프로그래밍의 기본 구조와 흐름
- 2-3-1 표준 출력 함수
- 2-3-1-1 원하는 표준 라이브러리를 찾아가는 과정
- 2-3-1-2 표준 출력 함수: printf( )
- 2-3-1-3 에러 코드: LNK2019, LNK1120
- 2-3-1-4 데이터형 기본 분류 출력
- 2-3-2 변수의 선언 명령문
- 2-3-2-1 변수의 선언 명령문은 어디에 작성해야 하는가?
- 2-3-2-2 왜 변수를 선언하는가?
- 2-3-3 대입 명령문
- 2-3-3-1 =은 수학에서 사용하는 등호의 개념이 아니다!
- 2-3-3-2 대입 명령문
- 2-3-3-3 하드 코딩은 최대한 피해야 한다
- 2-3-4 표준 입력 함수
- 2-3-4-1 사용자를 고려한 프로그램
- 2-3-4-2 표준 입력 함수: scanf( )
- 2-3-4-3 함수 scanf의 위험성
- 2-4 실무를 대비한 프로그래밍 구조
- 2-4-1 사용자 정의 함수
- 2-4-1-1 에러 코드: C2371
- 2-4-2 사용자 정의 헤더 파일 생성
- 2-4-3 기능별 파일 분리
- 2-4-3-1 소스 파일 분리
- 2-4-3-2 대형 프로그램 작성을 위한 파일 구조 예시
- 2-4-4 주석문
- 2-4-5 소스코드의 영역 구분
- 2-4-6 템플릿 제작
- 2-5 디버깅
- 2-5-1 에러(오류), 버그, 경고
- 2-5-2 디버깅의 개념
- 2-5-2-1 디버깅은 고급이 아닌 기초 기술이다
- 2-5-2-2 상황에 맞는 디버깅 방법 선택
- 2-5-3 중단점을 활용한 디버깅 실습
- 3장. C 프로그래밍의 기본
- 3-1 리터럴
- 3-1-1 문자 리터럴
- 3-1-1-1 문자 리터럴 표현법
- 3-1-2 문자열 리터럴
- 3-1-2-1 문자열 리터럴 표현법
- 3-1-1 정수 리터럴
- 3-1-3-1 정수 리터럴 표현법
- 3-1-3-2 정수 리터럴 접미사
- 3-1-4 실수 리터럴
- 3-1-4-1 실수 리터럴 표현법
- 3-1-4-2 실수 리터럴 접미사
- 3-2 데이터형
- 3-2-1 문자 데이터형
- 3-2-1-1 문자 데이터형
- 3-2-1-2 데이터형의 크기
- 3-2-1-3 범위: 최솟값과 최댓값
- 3-2-1-4 언더플로와 오버플로
- 3-2-1-5 문자열 저장
- 3-2-2 정수 데이터형
- 3-2-2-1 정수 데이터형
- 3-2-2-2 데이터형의 크기
- 3-2-2-3 범위: 최솟값과 최댓값
- 3-2-2-4 언더플로와 오버플로
- 3-2-3 실수 데이터형
- 3-2-3-1 실수 데이터형
- 3-2-3-2 데이터형의 크기
- 3-2-3-3 범위: 최솟값과 최댓값
- 3-2-3-4 언더플로와 오버플로
- 3-2-4 불리언 데이터형
- 3-2-4-1 불리언 데이터형
- 3-2-4-2 데이터형의 크기
- 3-2-5 기타 데이터형
- 3-2-5-1 특정 데이터형 없음: void
- 3-2-5-2 고정 크기 정수 데이터형
- 3-2-5-3 복소수 데이터형
- 3-3 변수와 상수
- 3-3-1 변수의 선언
- 3-3-1-1 변수의 선언 명령문
- 세이브 포인트
- 3-3-1-2 변수명 네이밍 규칙
- 3-3-1-3 한 명령문에 여러 개 변수 선언
- 3-3-2 변수 초기화
- 3-3-2-1 대입 명령문을 활용한 초기화
- 3-3-2-2 선언 명령문과 동시에 초기화
- 3-3-3 상수
- 3-3-3-1 상수의 선언 명령문
- 3-3-3-2 상수의 정의 확인
- 3-3-4 변수의 종류
- 3-3-4-1 지역 변수
- 3-3-4-2 레지스터 변수
- 3-3-4-3 전역 변수
- 3-3-4-4 정적 지역 변수
- 3-3-4-5 변수 종류 비교
- 3-4 표준 입출력
- 3-4-1 제어 문자
- 3-4-2 문자 전용 입출력 함수
- 3-4-2-1 putchar()
- 3-4-2-2 getchar()
- 3-4-2-3 표준 입력 함수와 버퍼
- 3-4-2-4 fputc()
- 3-4-2-5 fgetc()
- 3-4-3 문자열 전용 입출력 함수
- 3-4-3-1 puts()
- 3-4-3-2 gets()와 gets_s()
- 3-4-3-3 fputs()
- 3-4-3-4 fgets()
- 3-4-4 범용 입출력 함수
- 3-4-4-1 printf()
- 3-4-4-2 scanf()
- 3-4-4-3 파일 입출력 전용 함수 fprintf()와 fscanf()
- 3-5 기본 연산자
- 3-5-1 연산자 분류 및 우선순위표
- 3-5-2 산술 연산자
- 3-5-2-1 덧셈과 뺄셈 산술 연산자
- 3-5-2-2 곱셈과 나눗셈 산술 연산자
- 3-5-2-3 나머지 산술 연산자
- 3-5-2-4 형 확장
- 3-5-2-5 형 축소
- 3-5-3 증감 연산자
- 3-5-3-1 단항 산술 연산자
- 3-5-3-2 전위와 후위의 차이
- 3-5-4 관계 및 동등 연산자
- 3-5-4-1 관계 연산자
- 3-5-4-2 동등 연산자
- 3-5-5 논리 연산자
- 3-5-5-1 AND 논리 연산자
- 3-5-5-2 OR 논리 연산자
- 3-5-5-3 NOT 논리 연산자
- 3-5-6 대입 및 복합 대입 연산자
- 3-5-6-1 대입 연산자
- 3-5-6-2 산술 복합 대입 연산자
- 3-5-6-3 복잡한 코드의 분리
- 3-5-7 형 변환 연산자
- 3-5-8 sizeof 연산자
- 3-5-9 조건 연산자
- 3-6 사용자 정의 함수
- 3-6-1 함수의 원형
- 3-6-2 함수의 구조(선언부, 구현부, 호출부)
- 3-6-2-1 구현부
- 3-6-2-2 선언부
- 3-6-2-3 호출부
- 3-6-2-4 이벤트 → 조건 → 핵심 코드(액션)
- 3-6-3 함수의 4가지 유형
- 3-6-3-1 함수의 4가지 유형 분류 기준
- 3-6-3-2 매개변수X & 반환값X 함수
- 3-6-3-3 매개변수O & 반환값X 함수
- 3-6-3-4 매개변수X & 반환값O 함수
- 3-6-3-5 매개변수O & 반환값O 함수
- 3-7 제어 명령문
- 3-7-1 조건문
- 3-7-1-1 if 조건문
- 3-7-1-2 if ~ else 조건문
- 3-7-1-3 if ~ else if ~ else 조건문
- 3-7-1-4 중첩 if 조건문
- 3-7-1-5 switch ~ case 조건문
- 3-7-1-6 중첩 조건문
- 3-7-2 반복문
- 3-7-2-1 for 반복문
- 3-7-2-2 while 반복문
- 3-7-2-3 do ~ while 반복문
- 3-7-2-4 중첩 반복문
- 3-7-3 분기문
- 3-7-3-1 리턴 명령문(return)
- 3-7-3-2 continue 명령문
- 3-7-3-3 break 명령문
- 3-7-3-4 goto 명령문과 레이블
- 3-8 사용자 정의 데이터형
- 3-8-1 구조체
- 3-8-1-1 구조체의 필요성
- 3-8-1-2 구조체 정의와 선언
- 3-8-1-3 구조체 정의와 선언 01: 별도 구분
- 3-8-1-4 구조체 정의와 선언 02: 정의에서 동시에
- 3-8-1-5 구조체 정의와 선언 03: typedef를 활용
- 3-8-1-6 구조체 정의와 선언 04: 익명 구조체
- 3-8-1-7 구조체 초기화
- 3-8-1-8 구조체 대입 연산
- 3-8-1-9 구조체를 멤버로 가진 구조체
- 3-8-1-10 구조체의 크기 및 정렬
- 3-8-2 공용체
- 3-8-2-1 공용체 정의와 선언
- 3-8-2-2 공용체 초기화
- 3-8-2-3 공용체의 크기
- 3-8-3 열거형
- 3-8-3-1 열거형의 필요성
- 3-8-3-2 열거형 정의와 선언
- 3-8-3-3 열거형 지정 초기화
- 3-8-3-4 찰떡궁합, 열거형과 switch ~ case 조건문
- 3-9 전처리기
- 3-9-1 파일 포함: #include
- 3-9-1-1 표준 라이브러리 헤더 파일 포함
- 3-9-1-2 사용자 정의 헤더 파일 포함
- 3-9-1-3 지정된 경로의 헤더 파일 포함
- 3-9-2 컴파일 제어: #pragma
- 3-9-2-1 #pragma once
- 3-9-2-2 #pragma warning
- 3-9-2-3 #pragma message
- 3-9-2-4 #pragma pack
- 3-9-3 매크로 정의: #define과 #undef
- 3-9-3-1 #define 매크로의 구조
- 3-9-3-2 매크로 정의
- 3-9-3-3 상수 같은 매크로
- 3-9-3-4 함수 같은 매크로
- 3-9-3-5 #연산자: 토큰을 문자열로 변환
- 3-9-3-6 ##연산자: 토큰 결합
- 3-9-3-7 #undef: 매크로 해제
- 3-9-4 조건부 컴파일
- 3-9-4-1 #ifdef ~ #else ~ #endif
- 3-9-4-2 #ifndef ~ #else ~ #endif
- 3-9-4-3 #if ~ #elif ~ #else ~ #endif
- 3-9-4-4 #if defined ~ #elif defined ~ #else ~ #endif
- 3-9-5 정의된 매크로
- 3-9-6 기타, #line과 #error
- 3-9-6-1 #line
- 3-9-6-2 #error
- 3-10 1차원 배열
- 3-10-1 배열의 필요성
- 3-10-2 배열의 선언, 배열 요소, 치명적 단점
- 3-10-2-1 배열의 선언과 배열 요소별 접근
- 3-10-2-2 배열의 치명적 단점
- 3-10-3 배열 초기화
- 3-10-3-1 배열 선언 명령문에서 초기화
- 3-10-3-2 배열 선언 명령문에서 자동 초기화
- 3-10-3-3 배열 선언 명령문에서 일부 초기화 생략
- 3-10-4 배열 대입
- 3-10-5 배열의 크기
- 3-10-6 배열과 반복문
- 3-10-7 배열에 문자열 저장
- 3-10-7-1 문자열 데이터형이 없어서 발생하는 문제
- 3-10-7-2 문자 데이터형 배열의 선언과 동시에 초기화
- 3-10-7-3 문자 데이터형 배열의 선언과 대입 연산자로 초기화
- 3-10-7-4 배열의 크기를 +1로 표기하지 않을 때
- 3-10-8 배열에 문자열 대입
- 3-11 포인터 변수
- 3-11-1 주소 연산자(&)와 간접 참조 연산자(*)
- 3-11-1-1 메모리 주소의 개념
- 3-11-1-2 주소 연산자
- 3-11-1-3 간접 참조 연산자
- 3-11-2 포인터 변수 선언
- 3-11-3 포인터 변수의 필요성
- 3-11-3-1 지역 변수의 사용 범위에 따른 한계
- 3-11-3-2 함수의 인자에 변수로 값 공유
- 3-11-3-3 함수의 인자에 포인터 변수로 주소 공유
- 3-11-4 주소와 포인터 변수의 크기
- 3-11-5 억지로 만든 포인터 변수 예시
- 3-11-6 포인터 변수 대입
- 3-11-7 포인터 변수와 const
- 3-12 동적 메모리
- 3-12-1 동적 메모리 할당과 해제: malloc( )과 free( )
- 3-12-2 동적 메모리를 배열처럼 활용
- 3-12-3 널 포인터
- 3-12-4 포인터 변수의 활용법 4가지 정리
- 3-12-5 memset( )
- 3-12-6 calloc( )
- 3-12-7 realloc( )
- 3-13 문자열
- 3-13-1 배열과 문자열
- 3-13-1-1 char 배열 선언 명령문
- 3-13-1-2 인덱스로 문자 접근
- 3-13-1-3 문자열 대입
- 3-13-1-4 입력 함수로 문자열 받기
- 3-13-2 포인터 변수와 문자열
- 3-13-2-1 char 포인터 변수 선언 명령문
- 3-13-2-2 인덱스로 문자 접근
- 3-13-2-3 문자열 대입
- 3-13-2-4 입력 함수로 문자열 받기
- 3-13-3 문자열 연산
- 3-13-3-1 문자열 길이: strlen( )
- 3-13-3-2 문자열 비교: strcmp( )과 strncmp( )
- 3-13-3-3 문자열 검색: strchr( )과 strrchr( )과 strstr( )
- 3-13-3-4 문자열 복사: strcpy( )과 strncpy( )
- 3-13-3-5 문자열 연결: strcat( )과 strncat( )
- 3-13-3-6 문자열 자르기: strtok( )
- 3-13-4 문자열과 정수 및 실수 변환
- 3-13-4-1 문자열을 정수로: atoi( ) atol( ) atoll( )
- 3-13-4-2 문자열을 실수로: atof( )
- 3-13-4-3 정수를 문자열로: sprintf( )
- 3-13-4-4 실수를 문자열로: sprintf( )
- 3-14 파일 입출력
- 3-14-1 파일의 개방과 폐쇄
- 3-14-1-1 파일 개방과 폐쇄
- 3-14-1-2 절대 경로와 상대 경로
- 3-14-2 파일 개방 모드
- 3-14-2-1 파일 개방 모드 정리
- 3-14-2-2 파일 개방 모드: write
- 3-14-2-3 파일 개방 모드: append
- 3-14-2-4 파일 개방 모드: read
- 3-14-2-5 파일 개방 모드: +
- 3-14-3 문자 전용 입출력 함수
- 3-14-3-1 fputc( )
- 3-14-3-2 fgetc( )
- 3-14-4 문자열 전용 입출력 함수
- 3-14-4-1 fputs( )
- 3-14-4-2 fwrite( )
- 3-14-4-3 fgets( )
- 3-14-4-4 fread( )
- 3-14-5 범용 입출력 함수
- 3-14-5-1 fprintf( )
- 3-14-5-2 fscanf( )
- 3-14-6 파일 포인터 위치 변경과 찾기: fseek( )와 ftell( )
- 3-14-6-1 fseek( )와 ftell( )
- 3-14-6-2 파일 크기 계산에 활용
- 3-14-7 파일의 처음으로 복귀: rewind( )
- 3-14-8 파일의 끝인지 검사: feof( )
- 3-15 프로그래밍 8가지 지침
- 3-15-1 프로그래밍 스킬보다 논리적 사고 능력이 중요하다
- 3-15-2 핵심 코드부터 시작해 점차 구현해야 한다
- 3-15-3 처음부터 실수를 줄일 수 있는 버릇을 들여라
- 3-15-4 팀 프로그래밍은 네이밍 규정부터 시작된다
- 3-15-5 가독성 있는 코딩은 기본 중 기본이다
- 3-15-6 에러 & 버그와 친해질수록 경험이 쌓인다
- 3-15-7 디버깅을 할 수 있어야 비로소 프로그래밍을 시작한 것이다
- 3-15-8 기능 구현만이 아닌 예외 처리와 디버깅용 코드를 작성하라
- 4장. C 프로그래밍의 응용
- 4-1 리터럴 응용
- 4-1-1 비트 표현을 위한 준비
- 4-1-2 정수 리터럴의 비트 표현
- 4-1-3 문자 리터럴의 비트 표현
- 4-1-4 실수 리터럴의 비트 표현
- 4-2 연산자 응용
- 4-2-1 비트 논리 연산자
- 4-2-1-1 논리곱(AND) 비트 논리 연산자
- 4-2-1-2 배타적 논리합(XOR) 비트 논리 연산자
- 4-2-1-3 논리합(OR) 비트 논리 연산자
- 4-2-1-4 부정(NOT) 비트 논리 연산자
- 4-2-2 비트 이동 연산자
- 4-2-2-1 왼쪽 비트 이동 연산자
- 4-2-2-2 오른쪽 비트 이동 연산자
- 4-2-3 비트 복합 대입 연산자
- 4-2-4 콤마 연산자
- 4-3 사용자 정의 함수 응용
- 4-3-1 구조체 매개변수
- 4-3-2 배열 매개변수
- 4-3-3 포인터 변수 매개변수
- 4-3-4 가변 인자 매개변수
- 4-3-5 구조체 반환
- 4-3-6 배열 반환
- 4-3-7 포인터 변수 반환
- 4-3-8 void 포인터 반환
- 4-3-9 재귀 호출 함수
- 4-4 배열 응용
- 4-4-1 구조체 배열
- 4-4-2 포인터 배열
- 4-4-3 2차원 배열의 선언, 배열 요소 접근
- 4-4-4 2차원 배열 초기화
- 4-4-5 2차원 배열 대입
- 4-4-6 2차원 배열의 크기
- 4-5 포인터 변수 응용
- 4-5-1 배열명을 포인터 변수에 저장
- 4-5-2 구조체 포인터
- 4-5-3 배열 포인터
- 4-5-4 이중 포인터 변수 선언
- 4-5-5 이중 포인터 변수의 필요성
- 4-5-5-1 함수의 매개변수로 포인터 변수의 주소 교환
- 4-5-5-2 함수의 인자에 포인터 배열로 주소 공유
- 4-5-6 함수 포인터
- 4-5-7 void 포인터


