본문 바로가기
  • 適者生存
WorkOut/정보처리기사

C언어 | 배열과 문자열

by lcrvvxln 2024. 3. 18.

 

적자생존

9. 배열 (Array)


- 같은 자료형의 변수들로 이루어진 집합

(1) 배열 종류

 

[1] 1차원 배열

  • 1차원 배열 선언

- 초깃값 X : 자료형 배열명 [배열 요소 개수];
- 초깂값 O : 자료형 배열명 [배열 요소 개수] = {초깃값};

 

int a[3] = {1,2};

# 3번째 요소는 0으로 초기화 
  • 배열 요소 개수 만큼 같은 자료형 데이터 공간 할당
  • 초깃값 선언 X 시, 쓰레기값 저장
  • 배열 요소 개수보다 적은 개수로 초기화하면 초깃값 없는 값들은 정수형 0, 실수형 0.0, 문자형 NULL (아스키코드 0) 로 초기화

 

#include <stdio.h>

int main(){
   int a[3]={1,2};
   int i;
   for(i=0; i<3; i++)
     printf('%d\n',a[i]);
   return 0;
}

# 1
# 2
# 0
  • 요소 개수 3개인 정수형 배열 a 선언, a[0]=1, a[1]=2로 초기화, a[2]=0 자동 초기화
  • 정수형 변수 i 선언
  • for문의 초기식에 따라 i 0으로 초기화, 0<3 조건 만족으로 반복문 실행 > a[0]인 1 출력
  • 반복문 종료로 증감식에 따라 i 1 증가 (i=1) > 1<3 조건 만족으로 반복문 실행 > a[1]인 2 출력
  • 증감식에 따라 i 1 증가 (i=2) > 2<3 조건 만족으로 반복문 실행 > a[2]인 0 출력
  • 증감식 따라 i 1 증가 (i=3) > 조건 불만족으로 반복문 탈출

 

[2] 2차원 배열

  • 2차원 배열 선언

- 초깃값 X : 자료형 배열명 [행 개수] [열 개수];
- 초깃값 O : 자료형 배열명 [행 개수] [열 개수] = {초깃값};

  • 행 개수 * 열 개수 만큼 같은 자료형 데이터 공간 할당
  • 초깃값 선언 X 시, 쓰레깃값 저장
  • 행 개수 * 열 개수보다 적은 개수로 초기화 시, 명시되지 않은 값들은 정수형 0, 실수형 0.0, 문자형 NULL로 초기화

 

#include <stdio.h>

int main(){
   int a[2][3]={1,2,3,4};
   int i,j;
   for(i=0; i<2; i++)
     for(j=0; j<3; j++)
       printf('%d ', a[i][j]);
   return 0;
}

# 1 2 3 4 0 0
  • 정수형 2차원 배열 행2*열3 선언, a[0][0]=1 / a[0][1]=2 / a[0][2]=3/ a[1][0]=4 / a[1][1]=0 / a[1][2]=0 초기화
  • 정수형 변수 i, j 선언
  • for 반복문 초기식에 따라 i=0으로 초기화, 0<2이므로 조건 만족 반복문 실행
  • 이중 for 반복문 초기식에 따라 j=0으로 초기화, 0<3이므로 조건 만족 반복문 실행 > a[0][0] 인 1 출력
  • 반복문 종료 후, 이중 for문 증감식에 따라 j 1 증가 (j=1), 1<3 조건 만족으로 반복문 실행 > a[0][1] 2 출력
  • 반복문 종료 후, 이중 for문 증감식에 따라 j 1 증가 (j=2), 2<3 조건 만족 반복문 실행 > a[0][2] 3 출력
  • 반복문 종료 후, 이중 for문 증감식에 따라 j 1 증가 (j=3), 조건 불만족으로 이중 for 반복문 탈출
  • 1차 for 반복문 종료 후, 증감식에 따라 i 1 증가 (i=1) , 1<3 조건 만족으로 반복문 실행
  • 이중 for 반복문 초기식에 따라 j=0 초기화, 0<3 조건 만족 반복문 실행 > a[1][0] 4 출력
  • 반복문 종료 후, 이중 for문 증감식에 따라 j 1 증가 (j=1), 1<3 조건 만족 반복문 실행 > a[1][1] 0 출력
  • 반복문 종료 후, 이중 for문 증감식에 따라 j 1 증가 (j=2), 2<3 조건 만족 반복문 실행 > a[1][2] 0 출력
  • 반복문 종료 후, 이중 for문 증감식에 따라 j 1 증가 (j=3), 조건 불만족으로 이중 for 반복문 탈출
  • 1차 for 반복문 종료 후, 증감식에 따라 i 1 증가 (i=2), 조건 불만족으로 1차 for 반복문 탈출

 


 

10. 문자열

(1) 1차원 배열과 문자열


- C언어 문자열은 char형 배열로 표현
- 문자열 초기화 시, 마지막에 NULL 문자 삽입되므로 ** 초기화 글자 수보다 1 이상 큰 값 ** 으로 배열 선언
- 초기화 시, 배열 크기 명시하지 않으면 문자열 문자 수 +1만큼 자동 생성

  • printf 함수 사용 %s로 문자열 읽고 출력
  • printf 파라미터에 문자 읽기 시작 주소 제시 > 시작 주소부터 NULL 직전 값까지 읽어서 출력

 

- 문자열의 주소

포인터 개념 필요
변수에 & 붙이기 OR 1차원 배열의 대괄호 값 빼고 사용

ex. int a[5];
> &a[0] = 배열 a 0번째 값 주소
> &a[3] = 배열 a 3번째 값 주소
> a = 배열 a 0번째 값 주소 = 배열 a 시작 주소
> a+3 = 배열 a 3번째 값 주소 = 대괄호에 더하기 한 값이랑 동일하다고 보면 됨

 

#include <stdio.h>

int main(){
   char a[8]='Hello';
   printf('%s\n',a);
   printf('%s\n',a+1);
   a[3]=NULL;
   printf('%s\n',a+1);
   printf('%s\n',a+4);
   return 0;
}

# Hello
# ello
# el
# o
  • 문자형 1차원 배열 a 선언, a[0]~a[4] ='Hello', a[5]~a[7]=NULL
  • 배열 a 시작 주소부터 NULL 들어있는 구간 직전까지(=a[4])  출력, Hello
  • 배열 a 1번째 값 주소부터 NULL 까지, ello 출력
  • 배열 a 3번째 값  NULL로 변경 > Hello = HelNULLo
  • 배열 a 1번째 값 주소 a[1]부터 NULL 까지, el 출력
  • 배열 a 4번째 값 주소 a[4]부터 NULL까지, o 출력
printf('%s\n', a); = printf('%s\n', &a[0]);
printf('%s\n',a+1); = printf('%s\n', &a[1]);
printf('%s\n', a+4); = printf('%s\n', &a[4]);

 

 

(2) 2차원 배열과 문자열


- 문자열 여러 개 정의 시, char형 2차원 배열 사용


#include<stdio.h>
int main(){
   char a[2][8]={'Hello', 'hoxypot'};
   printf('%s\n',a[0]);
   printf('%s\n',a[1]);
   printf('%s\n',a[1]+3);
   a[1][4]= NULL;
   printf('%s\n',a[1]+2);
   return 0;
}

# Hello
# hoxypot
# ypot
# xy
  • 문자형 2차원 배열 a 행2*열8 선언, a[0][0]~a[0][4] = Hello , a[1][0]~a[1][6] = hoxypot , 나머지는 null로 초기화
  • a[0] 인 Hello 출력 (a[0][0]~a[0][4]까지, null 직전)
  • a[1] 인 hoxypot 출력 (a[1][0]~a[1][6]까지)
  • a[1][3]~ a[1][6] ypot 출력
  • a[1][4] 값 null로 변경, hoxypot > hoxyNULLot
  • a[1][2]~a[1][3] xy 출력

 

- 2차원 배열의 주소

배열 변수에 & 붙이기
OR 대괄호 하나 빼기

ex. int a[3][2];
> &a[0][0] = 배열 a의 0번째 행의 0번째 열 주소  
> &a[1][2] = 배열 a의 1번째 행의 2번째 열 주소
> a[0] = 배열 a의 0번째 행의 0번째 열 주소
> a[1]+2 = 배열 a의 1번째 행의 2번째 열 주소
printf('%s\n',a[0]); = printf('%s\n', &a[0][0]);
printf('%s\n',a[1]); = printf('%s\n', &a[1][0]);
printf('%s\n',a[2]+3); = printf('%s\n', &a[2][3]);
printf('%s\n',a[1]+2); = printf('%s\n', &a[1][2]);