티스토리 뷰

함수

함수의 기본 형태

  • 데이터타입 : 함수가 리턴하는 값의 타입
  • 함수 이름 : 함수 기능과 밀접한 이름으로 만드는 것이 좋음
  • 인수 목록 : 함수에 필요한 값을 전달할 때 사용
  • 함수의 내용 : 중괄호 {}사이의 영역 안에서 작성

자료형 함수이름(인수목록)
{
함수의 내용
}

#include<stdio.h>

int Add(int i, int j){
    return i + j;
}

int main(){
    int a = 10;
    int b = 20;
    int hap = 0;

    hap = Add(a,b);
    printf("%d\n",hap);
    
    return 0;
}

void타입

  • 결과값을 리턴하지 않는 함수

** 문제 : 사각형의 넓이를 구하는 함수를 작성해보자. 사각형의 넓이는 가로의 길이* 세로의 길이를 구하면 된다.

사용자로부터 두 정수를 각각 입력 받아 함수의 전달인자로 전달하고, 사각형의 넓이를 출력하라

#include <stdio.h>

// 사각형 넓이를 출력하는 void 함수
void area(int w, int h) {
    int a = w * h;
    printf("%d * %d = %d\n", w, h, a);
}

int main() {
    int w, h;

    printf("두 개의 정수를 입력하시오: ");
    scanf("%d %d", &w, &h);

    area(w, h);

    return 0;
}

.

#include <stdio.h>

// 최대값, 최소값을 출력하는 void 함수
void compare(int a, int b) {
    if (a > b) {
        printf("최대값 : %d, 최소값 : %d\n", a, b);
    }
    else if (a < b) {
        printf("최대값 : %d, 최소값 : %d\n", b, a);
    }
    else {
        printf("두 수가 같습니다: %d\n", a);
    }
}

int main() {
    int a, b;

    printf("두 정수를 입력하시오: ");
    scanf("%d %d", &a, &b);

    compare(a, b);  // void 함수 호출

    return 0;
}

 

변수

지역변수

  • 코드에서 지역의 의미
  • 전국을 상대로 김동건을 부르면 어떤 김동건인지 알 수 없다,
  • 각 지방에 가서 이주성을 부르면 해당 지역의 김동건이 대답을 할 것 이다.
  • 김동건은 그 지역의 변수인 지역변수를 의미한다.
  • 같은 이름이라도 다른 영역의 함수에 속해 있으므로 독립된 다른 변수이다.
  • 함수 호출 순서와 소멸 순서는 반대이다.
  • 매개변수도 지역변수이다.

전역변수

  • 함수 바깥쪽에 선언된 변수
  • 전역변수는 프로그램 시작하자마자 메모리 상에 올라가서 프로그램이 종료될 때 메모리 상에서 소멸된다.
  • 스택메모리 x, 데이터 영역에 들어감

static변수

  • 사전적 의미로 정지된, 고정상태의 뜻을 갖는다
  • 지역변수처럼 중괄호 영역에서 선언되지만, 중괄호를 벗어나도 메모리 상에 고정되어 소멸하지 않는다.
  • 내가 원하는 지역에 선언 가능, 한번 선언되면 소멸이 안됨 - 프로그램이 종료될 때 메모리 상에서 소멸

** 문제 : 책읽기 마라톤

 

배열

  • 배열이란 같은 속성을 가진 것들을 나열해 놓은 것을 말한다.
  • 배열은 요소가 순서대로 여러 개 모인 것이다.
  • 배열의 요소는 같은 속성을 지니고 있어야 한다.
  • 변수가 많으면 많을 수록 선언이 힘들어진다 -> 배열 사용 ex)int a[100];
  • 배열의 타입: 베열 요소들의 타입을 나타낸다.
  • 배열 이름 : 각 배열 요소에 접근하기 위해 배열 이름을 나타낸다.
  • 배열 길이 : 변수의 개수를 나타낸다
  • int array[5]의 경우 배열의 타입은 int,배열의 이름은 array, 길이는 5
  • 배열은 인덱스(arr[0] 등)로 접근하며, 0부터 시작해 arr[0] = 1;처럼 값을 넣는다.

 

  •  int arr[5] = {1, 2, 3, 4, 5} == int arr[] = {1, 2, 3, 4, 5}
  • 같은 타입끼리 복사가 가능하다.
  • 배열은 상수이기 떄문에 변수 복사하듯 복사하면 에러 발생
  • 배열은 요소끼리 복사해야 한다.
#include <stdio.h>

int main() {
    int i;
    int arr1[5] = {1, 2, 3, 4, 5};
    int arr2[5];

    for(i = 0; i < 5; i++) {
        arr2[i] = arr1[i];
    }

    for(i = 0; i < 5; i++) {
        printf("%d\n", arr2[i]);
    }

    return 0;
}

 

 

문자열을 변수로 활

#include <stdio.h>

int main() {
    char str[12] = "hello world";
    printf("%s\n", str);

    return 0;
}
  • 문자열 끝에는 null문자가 반드시 추가됨 -> char str[5] = shot;
  • shot같은 경우 4글자 지만 배열의 크기는 5이다.
  • har str[100] = "Hello";라고 하면 앞의 5칸에 H, e, l, l, o가 들어간다.
    남은 95칸에는 의미 없는 값(쓰레기 값)이 들어있다.
    컴퓨터는 문자열 끝을 알기 위해 마지막에 \0(null 문자)을 넣는다.
  • H, e, l, l, o의 공간은 5개가 아니라 null을 포함하여 6개이다.

 

포인터

  • 포인터는 포인터 변수의 줄임말로 메모리의 주소값을 저장하고 있는 변수
  • 보통 주소값을 저장한다는 표현을 반대로 해당 메모리를 가리킨다라고도 표현하다.
  • 어느 특정 메모리 주소를 가리키거나 향하고 있다는 뜻이다.

포인터 사용방법

  • 포인터 변수 선언 시 일반 변수명 앞에 *기호를 붙여준다. 주소값만 저장하겠다는 의미
  • &기호를 통해 변수의 주소값을 얻을 수 있다.(&의 의미는 주소값)
  • 포인터 변수 pB 가 변수 b의 주소값을 가리킨다고도 표현
#include <stdio.h>

int main(){
    
    int a = 100;
    int *pA = &a;

    printf("a: %d \n", a);      // a: 100
    printf("&a: %p\n", &a);    // &a: 주소값이 나옴 
    printf("pA: %p\n", pA);    // pA: 주소값이 나옴
    printf("*pA: %d\n", *pA);  // *pA: 100

}

int *pA = &a;의 *pA와 printf("*pA: %d\n", *pA);의 *pA는 다르다.

위는 선언할 때 pA라는 변수가 포인터라는걸 표시하기 위해서 *pA를 사용했지만

밑은 가리키는 해당 메모리의 실제값을 참조하라(나타내라) 라는 뜻

 

포인터와 배열

배열 이름의 의미

  • 배열의 이름은 해당 배열의 첫 번째 요소의 주소값을 갖는다. 즉 첫번째 요소의 주소값을 가리키는 포인터라는 의미이다.
  • arr은 이 배열을 가리키고 있는 포인터임을 알 수 있다.
  • arr은 &arr[0]의 값과 일치한다.

 

#include <stdio.h>

int main(){
    int arr[] = {1,2,3,4,5};

    for(int i = 0; i < 5; i++){
        printf("%d\n",arr[i]);
        printf("%p\n",&arr[i]);
    }
    printf("배열의 이름 : %p\n", arr);

    return 0;

}

배열의 첫번째 값과 배열의 이름이 같은 결과로 출력

 

배열의 이름 == 포인터

배열의 이름은 주소값을 갖는 포인터이지만 상수이므로 주소값을 변경할 수 없다.

 

함수와 포인터

  • 기본적인 함수의 인자 전달 형태는 복사이다.
  • a에서 b로 복사시 a에도 값이 존재하고 b에도 값이 존재한다.(메모리는 개별적으로 가지고 있고 값만 복사)
  • 배열의 인자는 포인터형으로 받는다.
  • 전달인자의 수가 많으면 난잡함, 배열을 전달인자로 사용하면 여러개의 값을 넘길 수 있다.
#include <stdio.h>

// func 함수는 int형 포인터를 매개변수로 받아 배열의 값을 출력함
void func(int *pArr){
    // 배열의 요소 5개를 차례로 출력
    for (int i = 0; i < 5; i++){
        printf("%d \n", *(pArr + i)); // 포인터 연산으로 배열 요소 출력 (arr[i]와 같음)
    }
}

int main(){
    int arr[5] = {1, 2, 3, 4, 5}; // 정수형 배열 선언 및 초기화

    func(arr); // 배열을 함수에 전달 (배열 이름은 포인터처럼 동작)

    return 0;
}

/*
출력 결과:
1 
2 
3 
4 
5 
*/
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/12   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함