본문 바로가기
C/C 문법

혼자 공부하는 C언어 (7~8강)

by Sein_ 2025. 9. 5.
728x90
1. 함수 (선언 / 정의 / 호출 / 반환)
2. 배열
3. 문자열 저장 (char 배열)

 

함수

  • 함수 정의
    • 함수를 정의할 때의 질문 3가지 = 함수의 구성
      1. 함수의 기능에 맞는 이름은 무엇인가? (함수명)
      2. 함수가 기능을 수행하는데 필요한 데이터는 무엇인가? (매개변수)
      3. 함수가 수행된 후의 결과는 무엇인가? (반환형) 
int sum(int x, int y)	//함수 원형
{
    int temp;
    temp = x + y;
    
    return temp;
}
  • 함수 호출
    • 호출할 함수명(인수1, 인수2);
    • 입력된 인수값은 호출된 함수의 매개변수에 복사되어 사용된다.
sum(1, 2);	//함수 호출
  • 함수 반환
    • 호출된 함수 실행을 끝내고 값을 반환할 때 return 문을 사용한다.
    • 함수의 실행을 끝내고 호출한 곳으로 돌아갈 때 사용한다.
int main()
{
    ...
    result = sum(1, 2);	//호출 및 반환된 결과 도착
    ...
}


int sum(int x, int y)
{
    int temp;
    temp = x + y;
    return temp; //결과 반환
}
  • 함수 선언
    • int sum(int x, int y);
      • 매개변수명은 생략이 가능하다. ( ex. int sum(int, int); )
    • 컴파일러가 함수를 인식할 수 있도록 알리는 역할
    • 함수 호출 전 선언을 통해 반환형을 미리 컴파일러에게 알려야한다.
      • 컴파일할 때, 함수를 호출한 자리에 반환값과 같은 형태의 저장공간을 준비하기 때문이다.
      • 호출 전 선언 혹은 정의하지 않으면 기본 int 반환형으로 간주한다.
    • 함수 선언이 없다면 함수 정의는 함수 호출 이전에 있어야한다. (주의!!)
  • 매개변수가 없는 함수
    • int sum(void) {...}
    • int sum() {...}
  • 반환값이 없는 함수
    • void say(char[] str) { ... return; }
#include <stdio.h>

//함수 선언
void say(char s[]);	

int main()
{
    ...
    //함수 호출
    say("hello");
    ...
}

//함수 정의
void say(char s[])
{
    printf("%s", s);
    return;
}
  • 함수 내 변수 사용범위
    • 변수의 사용 범위는 선언한 블록 내부로 제한된다.
    • 변수명은 여러 함수에서 동일하게 선언 가능하다.
  • 재귀호출 함수 (recursive call function)
    • 자기 자신을 호출하는 함수
    • 최초 호출한 곳이 아닌 이전에 호출했던 곳으로 돌아간다.
void say(int count)
{
    printf("hello\n");
    if(count == 3)
    {
        return;
    }
    say(++count);
    
    printf("jam\n");
}

// hello
// hello
// hello
// jam
// jam

 

 

배열

  • 배열 선언
    • 자료형 배열명 [요소개수]; (ex. int ary[5];)
  • 여러 변수 선언 VS 배열 선언
    • 전체 저장 공간의 크기는 같습니다.
    • 메모리에 할당되는 방식에 차이가 있습니다
      • 여러 변수 선언: 각 변수는 독립적인 공간을 갖고 각각의 이름을 사용한다.
      • 배열: 저장 공간이 연속으로 할당되며 배열명이 전체 공간의 이름이 된다.
  • 배열 요소 사용
    • 배열명[배열 요소 첨자]; (ex. ary[5];)
    • 배열 요소는 포인터 연산을 통해 접근한다.
    • 첨자가 사용범위를 벗어나면 배열에 할당된 영역을 벗어난 메모리를 사용하므로 침범한 영역의 용도에 따라 결과가 달라진다. (ex. int ary[5]; --> ary[6];)
  • 배열 값 대입
    • 배열명[배열 요소 첨자] = 값; (ex. ary[5] = 40;)
    • 사용하지 않은 배열 공간에는 쓰레기 값이 남아있다.
  • 배열 초기화
    • 자료형 배열명 [요소개수] = { 요소[0] 값, 요소[1] 값, ... };
    • 배열의 초기화는 최초 한 번만 가능하며 이후는 개별로 값을 대입해야한다.
    • 초깃값이 배열 요소의 갯수보다 적은 경우, 차례대로 초기화 후 남은 요소는 기본값으로 채워진다.
      int 0
      float 0.0
      char '\0' (null 문자)
    • 배열 요소의 개수가 생략된 경우 초깃값 개수만큼 배열 요소 개수가 정해진다.
  • 배열 요소의 개수 계산
    • 배열 요소의 개수 = 배열 전체 크기 / 배열 요소 하나의 크기
    • 배열 요소의 개수 = sizeof(배열명) / sizeof(배열 요소);
int score[5];
int count = sizeof(score) / sizeof(score[0]);

for(int i=0; i<count; i++)
{
    scanf("%d", &score[i];
}

 

문자열

  • 문자열(char형 배열) 선언
    • char 배열명[요소개수+1] = "저장할 문자열" (ex. char str[30] = "applejam";)
    • 저장할 문자열의 길이보다 하나 이상 크게 배열을 선언해야한다.
    • 초기화한 문자열은 배열에 차례대로 저장되어 문자열을 만든다.
    • 문자열 끝과 남는 배열 요소에 \0 (널 문자) 가 저장된다.
  • 널 null 문자 (\0)
    • 아스키 코드 값이 0인 문자
    • 문자열의 끝을 표시하는 용도
  • 문자열 복사 strcpy
    •  strcpy( 저장될 배열명, 저장할 문자열 );
    • 문자열의 길이가 다를 수 있으므로 대입 연산자로 문자열 복사가 불가하다.
    • strcpy 함수는 char 형 배열에 새로운 문자열을 저장하는 함수
    • 저장할 문자열의 길이만큼 char형 배열에 복사
char str1[80] = "cat";
char str2[80];

strcpy(str1, "tiger"); //str1 배열에 문자열 복사
strcpy(str2, str1); //str2 배열에 str1 배열의 문자열 복사

//str1: tiger
//str2: tiger
  • 빈칸을 포함한 문자열 입출력 (gets, puts)
    • scanf 사용시, 중간에 빈칸이 있는 경우 빈칸 전까지만 입력되는 부분을 보완
    • gets( char형 배열명 );
      • 입력 중간에 빈칸이나 탭 문자를 사용 가능하다.
      • enter 를 누르기 전까지 배열에 저장한다.
      • 배열의 크기를 검사하지 않아 메모리 영역 침범 주의 필요!
    • puts( 문자열 혹은 char형 배열명 );
      • 문자열을 화면에 출력한다.
      • 문자열을 출력한 후에 자동으로 줄을 바꾸어준다.
char str[80];

printf("문자열 입력 : ");
gets(str);

puts("입력된 문자열 : ");
puts(str);

//문자열 입력 : cat
//입력된 문자열 : 
//cat

'C > C 문법' 카테고리의 다른 글

혼자 공부하는 C언어 (11~12강)  (1) 2025.09.07
혼자 공부하는 C언어 (9~10강)  (0) 2025.09.06
혼자 공부하는 C언어 (5~6강)  (0) 2025.09.03
혼자 공부하는 C언어 (3~4강)  (1) 2025.09.02
혼자 공부하는 C언어 (1~2강)  (0) 2025.09.01