티스토리 뷰
함수
함수의 기본 형태
- 데이터타입 : 함수가 리턴하는 값의 타입
- 함수 이름 : 함수 기능과 밀접한 이름으로 만드는 것이 좋음
- 인수 목록 : 함수에 필요한 값을 전달할 때 사용
- 함수의 내용 : 중괄호 {}사이의 영역 안에서 작성
자료형 함수이름(인수목록)
{
함수의 내용
}
#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
*/