티스토리 뷰

반응형

 

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부터 시작
  • 포인터: 주소를 저장하는 변수, &와 *로 다룸
  • 배열과 포인터는 밀접하게 연결됨

연습 문제 ✍️

  1. 5명의 점수를 배열로 입력받아 총점과 평균을 구하세요.
  2. 배열 [1, 2, 3, 4, 5] 의 원소를 포인터를 이용해 출력하세요.
  3. 두 정수의 값을 서로 바꾸는 swap 함수를 포인터로 작성하세요.
  4. 포인터를 사용하여 문자열 "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' 만날 때까지 세기

 

반응형