티스토리 뷰
반응형
C언어 기초 Chapter 11~12: 배열과 포인터 완전 정리
Chapter 11. 1차원 배열
11-1. 배열의 선언과 초기화 방법
배열이란?
- 같은 자료형 변수를 여러 개 모아 하나의 이름으로 관리하는 것
- 인덱스(index)를 이용해 각 요소 접근
선언
int arr[5]; // 정수 5개 저장
double scores[10]; // 실수 10개 저장
초기화
int arr1[5] = {1, 2, 3, 4, 5};
int arr2[] = {10, 20, 30}; // 크기 생략 가능
char str[] = {'H', 'i', '\0'}; // 문자열 배열
11-2. 배열을 이용한 문제와 변수의 표현
배열 접근
#include <stdio.h>
int main(void) {
int arr[5] = {10, 20, 30, 40, 50};
for (int i = 0; i < 5; i++) {
printf("arr[%d] = %d\n", i, arr[i]);
}
return 0;
}
👉 출력:
arr[0] = 10
arr[1] = 20
arr[2] = 30
arr[3] = 40
arr[4] = 50
합 구하기 예제
#include <stdio.h>
int main(void) {
int scores[5] = {95, 87, 76, 64, 89};
int sum = 0;
for (int i = 0; i < 5; i++) {
sum += scores[i];
}
printf("총점 = %d, 평균 = %.2f\n", sum, sum / 5.0);
return 0;
}
Chapter 12. 포인터의 이해
12-1. 포인터란 무엇인가?
기본 개념
- 메모리의 주소(address) 를 저장하는 변수
- C 언어의 가장 강력하고 중요한 개념
int a = 10;
int *p; // int형 변수의 주소 저장 가능
p = &a; // a의 주소를 p에 저장
printf("a의 값 = %d\n", a);
printf("a의 주소 = %p\n", &a);
printf("포인터 p가 가리키는 값 = %d\n", *p);
👉 출력 예시:
a의 값 = 10
a의 주소 = 0x7ffee...
포인터 p가 가리키는 값 = 10
12-2. 포인터와 관련 있는 연산자: & 연산자와 * 연산자
- & : 변수의 주소를 가져옴
- * : 포인터가 가리키는 주소의 값(간접 참조)
예제:
int x = 5;
int *px = &x;
printf("x = %d\n", x); // 5
printf("&x = %p\n", &x); // 주소값
printf("px = %p\n", px); // 주소값
printf("*px = %d\n", *px); // 5 (포인터로 값 접근)
포인터와 배열의 관계
- 배열 이름 자체가 첫 번째 원소의 주소
int arr[3] = {10, 20, 30};
int *p = arr;
printf("%d %d\n", arr[0], *p); // 10 10
printf("%d %d\n", arr[1], *(p+1)); // 20 20
핵심 정리 ✅
- 배열: 같은 자료형의 데이터를 연속적으로 저장
- 배열 인덱스는 0부터 시작
- 포인터: 주소를 저장하는 변수, &와 *로 다룸
- 배열과 포인터는 밀접하게 연결됨
연습 문제 ✍️
- 5명의 점수를 배열로 입력받아 총점과 평균을 구하세요.
- 배열 [1, 2, 3, 4, 5] 의 원소를 포인터를 이용해 출력하세요.
- 두 정수의 값을 서로 바꾸는 swap 함수를 포인터로 작성하세요.
- 포인터를 사용하여 문자열 "Hello" 의 길이를 직접 계산하세요.
👉 연습문제 정답은? ▼
Chapter 11~12 연습문제 풀이
1) 5명의 점수를 배열로 입력받아 총점과 평균 구하기
#include <stdio.h>
int main(void) {
int scores[5];
int sum = 0;
for (int i = 0; i < 5; i++) {
printf("%d번째 학생 점수 입력: ", i + 1);
scanf("%d", &scores[i]);
sum += scores[i];
}
printf("총점 = %d\n", sum);
printf("평균 = %.2f\n", sum / 5.0);
return 0;
}
2) 배열 [1, 2, 3, 4, 5] 의 원소를 포인터로 출력하기
#include <stdio.h>
int main(void) {
int arr[5] = {1, 2, 3, 4, 5};
int *p = arr; // 배열 이름 = 첫 원소 주소
for (int i = 0; i < 5; i++) {
printf("%d ", *(p + i));
}
return 0;
}
👉 출력: 1 2 3 4 5
3) 두 정수의 값을 서로 바꾸는 swap 함수 (포인터 이용)
#include <stdio.h>
void swap(int *x, int *y) {
int temp = *x;
*x = *y;
*y = temp;
}
int main(void) {
int a = 10, b = 20;
printf("교환 전: a = %d, b = %d\n", a, b);
swap(&a, &b);
printf("교환 후: a = %d, b = %d\n", a, b);
return 0;
}
👉 출력:
교환 전: a = 10, b = 20
교환 후: a = 20, b = 10
4) 포인터를 사용하여 문자열 "Hello" 의 길이 계산
#include <stdio.h>
int main(void) {
char str[] = "Hello";
char *p = str;
int len = 0;
while (*p != '\0') { // 널 문자 만나면 종료
len++;
p++;
}
printf("문자열 길이 = %d\n", len);
return 0;
}
👉 출력: 문자열 길이 = 5
핵심 정리 ✅
- 배열 입력은 scanf("%d", &arr[i]); 처럼 주소 필요
- 포인터로 배열 접근 가능: *(p+i)
- swap 함수는 포인터로 전달(call by reference)
- 문자열 길이는 널 문자 '\0' 만날 때까지 세기
반응형
'[문법] C언어' 카테고리의 다른 글
9) C언어 포인터와 함수: 배열 전달, Call by Value vs Reference, const 정리 (2) | 2025.09.01 |
---|---|
8) C언어 포인터와 배열 완전정리: 관계, 연산, 문자열, 포인터 배열 (2) | 2025.09.01 |
6) C언어 함수 완전정리: 정의, 호출, 변수 범위와 재귀까지 (4) | 2025.08.31 |
5) C언어 조건문 완전정리: if / switch / break / continue (0) | 2025.08.31 |
4) C언어 반복문 완전정리: while, do~while, for 한눈에 배우기 (4) | 2025.08.31 |