🧼C, C++/기초및 입문

C언어 기초 #2 배열과 함수

Mawile 2021. 1. 12.
728x90

C계열언어 강좌 총정리

 

C계열언어 강좌 총정리

{[ C문법 기초 ]} 자료형 #1 배열과 함수 #2 연산자 #3 구조체와 공용체 #4 (*) 매크로와 열거형 #5 다양한 키워드 #6 (*) 비트필드 #7 포인터 #8 (**) 전처리문 #9 (추후에 내용추가..) {[ C++문법 기초 ]} 표준

mawile.tistory.com

 


개발환경 >> Visual Studio Code

언어 >> C17

운영체제 >> Windows10

 


안녕하세요!

이번에는 여러개의 자료형의 연속된 집합인 배열과

함수정의에 대한 설명을 시작하겠습니다.


{[ 배열 ]}

 

{[ 숫자배열 ]}

우선 배열은 단순하게 여러개의 동일한 데이터의 집합이라고 생각하시면됩니다.

예를들어서 이렇게 정의할수가 있습니다.

#include <stdio.h>

int main(){
    int array[10]; //정수형데이터 10개크기의 배열선언
}

 

"(자료형) (변수명)[(크기)];"

 

 

이런식으로 선언할수 있습니다.

그러면 배열내에있는 데이터를 직접 설정해보도록 하겠습니다!

 

 

#include <stdio.h>

int main(){
    int array[10] = {1,2,3,4,5,6,7,8,9,10};
    printf("%d", array[2]);
}

결과값

array[2] : array[2]라는것은 array라는 정수형배열의 2번째인덱스에있는 값을 반환받을 수 있습니다.

이 표현은 *(array + 2)와 같습니다. 이에 대한 자세한 설명은 포인터편에서 다루겠습니다.

 

 

근데 이상한 점이있습니다..

분명 array라는 배열의 2번째 인덱스라고적어서 결과값이 2라고나올줄 알았는데 3번째로 설정한 값인 3이 나왔습니다.

그 이유는 배열은 0부터 시작입니다.

즉, "int array[10];" 다음과같이 선언할때는 10개의 공간을 만들고 실제로 "array[2]"와 같이 값을 얻고싶을때는

0~9까지인겁니다.

한마디로 데이터상에는 이렇게 명시되어있습니다.

array[0] == 1;
array[1] == 2;
array[2] == 3;
array[3] == 4;
array[4] == 5;
array[5] == 6;
array[6] == 7;
array[7] == 8;
array[8] == 9;
array[9] == 10;

 

 

 

[ 그럼 만약에 이렇게 적으면 실제로 데이터상에는 값이 어떻게 남을까요? ]

#include <stdio.h>

int main(){
    int array[10] = {1,2,3}; //크기는 10인데 3개의 값만을 설정했다.
    printf("%d %d", array[2], array[3]);
}

결과값

보시다시피 결과값은 3과 0이나왔습니다.

근데 array[3]이라는 값은 우리가 직접 설정한 값이 아닙니다.

이렇게 표기할시 데이터상에는 이렇게 값이 남습니다.

 

array[0] == 1;
array[1] == 2;
array[2] == 3;
array[3] == 0;
array[4] == 0;
array[5] == 0;
array[6] == 0;
array[7] == 0;
array[8] == 0;
array[9] == 0;

 

 

그리고 여기서 명심할점은 저가 지금 까지 이해를 돕기위해서 값을 "설정"한다고했는데

정확히는 값을 "초기화"하는겁니다.

1이라는 값으로 초기화하고 3이라는 값으로 초기화한다. 이런식으로요.

 

{[ 문자배열 ]}

 

#include <stdio.h>

int main(){
	//크기 15의 char형 배열선언 
    char Character[15] = {97,98,99,100,101,102,103,104};
    // '\n'은 띄어쓰기출력이다.
    // ASCII표기방식에 따라 97을 %d(정수)로 포맷하면 97,
    // %c(단일문자)로 포맷하면 'a'이다.
    printf("%d %d %d\n%c %c %c", Character[0], Character[1], Character[2], Character[0], Character[1], Character[2]);
}

결과값

또한, 이렇게도 가능합니다.

#include <stdio.h>

int main(){
	// 단일문자로도 저장이 가능하다.
    // 뒤에 정의하지않는부분은 0으로 초기화된다.
    char Character[15] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'};
    printf("%d %d %d\n%c %c %c", Character[0], Character[1], Character[2], Character[0], Character[1], Character[2]);
}

이런식으로도 선언이 가능합니다!

그러면 문자열처럼 한번에 처리하려면 어떻게해야할까요?

 

 

#include <stdio.h>

int main(){
    char Character[15] = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};
    printf("%s", Character); // %s는 문자열 포맷형식이다.
}

결과값

결과값은 다음과같습니다.

' '또한 ASCII표기방식에 따라 32라는 값에 해당하므로 적어줘야합니다.

하지만 이렇게 문자를 하나하나 일일이 적으면 그만한 시간낭비가 따로없습니다.

그래서 한번에 문자열을 적는방법도 존재합니다!

 

#include <stdio.h>

int main(){
	//""로 문자열초기화가 가능하다.
    //''와 ""의 차이점은 아래설명 해놓았다.
    char Character[15] = "HELLO WORLD";
    printf("%s", Character);
}

결과값

우선 정상적으로 나왔습니다.

그러면 어쩔때는 ''를 사용하고 어쩔때는 ""를 사용합니다.

그 기준은 단일문자문자열입니다.

'a'와 같이 단일문자는 ''를 사용하고 "abc"와 같이 단일문자배열은 ""를 사용합니다.

 

또한 여기서 입문자분들이 많이하시는 실수 2가지가있습니다. [연산자관련 강좌 보러가기(미완성)]

첫번째는 단일문자배열은 "=="연산자로 비교할 수 없습니다.

예를들어서, 이런식으로는 사용하실수없습니다.

#include <stdio.h>

int main(){
    char Character[15] = "HELLO WORLD";
    if(Character == "HELLO WORLD") //어쩌고저쩌고
}

 

두번째는 단일문자배열은 "="연산자로 값을 대입 할 수 없습니다.

예를들어서, 이런식으로는 사용하실수없습니다.

#include <stdio.h>

int main(){
    char Character[15] = "HELLO WORLD";
    Charater = "hoi";
}

 

이러한 문제점들은 이후 강좌에서 해결방법을 알려드리겠습니다.

 

 

 

 

{[ 함수 ]}

함수에 대한 정의는 간단하게 다음과같이 정의할 수 있습니다.

void func(){ //void는 빈 자료형입니다. 반환타입은 존재하지않습니다.

}

int main(){
    func();
}

 

여기서 집고가야하실 키워드가있습니다.

"return"

은 함수에서 두가지역할을 합니다.

첫번째는 함수를 종료하는 역할,

두번째는 함수사이의 값을 전달하는 역할

입니다.

 

우선 함수의 반환타입에 따라 return해야할 값도 달리 해야합니다.

그러면 먼저 정수형 반환타입함수를 정의해보도록 하겠습니다!

#include <stdio.h>

int func(){
    int a = 3;
    return a;
}

int main(){
    func();
}

이렇게하면 func라는 int형 반환타입함수로부터 3이라는 값을 반환받게되는데 이 값은 어떻게 전달 받을까요??

 

#include <stdio.h>

int func(){
    int a = 3;
    return a;
    // a는 3입니다.
    // return 3; 이렇게도 반환가능
}

int main(){
    int a = func(); //값대입
    printf("%d", a); //출력
}

결과값

func함수에서 int형 a와 main함수의 a는 전혀다른 변수입니다. 이는 명심해주세요!

그러면 값을 다른함수로 전달하려면 어떻게 해야할까요??

 

#include <stdio.h>

void func(float f){ //전달받는 데이터와 데이터형식이 똑같아야합니다.
    printf("%f", f);
}

int main(){
    float f = 3.14;
    func(f);
}

 

결과값

정상적으로 잘 출력이 되었네요!!

반환타입은 아무값도 반환하지않을거라서 void로 했습니다!

 

 

 

 

[ 문자반환 함수 ]

문자배열및 단일문자에 관한 함수의 반환값을 받을려면 어떻게 해야할까요?

#include <stdio.h>

char func(){
    char a = 97;
    char b = 'b';
    return b; //b값 반환
}

int main(){
    char a = func();
    printf("%d %c", a, a);
}

결과값

이런식으로 받을 수가있습니다.

그러면...!! 단일문자배열을 받으러면 어떻게해야할까요?

 

#include <stdio.h>

char* func(){ //반환타입은 (char*)
    char *a ="HELLO WORLD";
    //배열은 다음과같이 선언가능
    //static은 전역변수선언을 의미합니다.
    //통상적으로 함수내에 존재하는 변수는 해당함수가 종료하면 값이 사라지는데
    //static은 값이 사라지지않도록 하라는 명령입니다.
    static c[15] = "hello world";
    return a;
}

int main(){
	// *표시에 관한 설명은 포인터강좌에서 자세하게 다루도록 하겠습니다. 
    char *b = func();
    printf("%s", b);
}

결과값

정상적으로 값이 나왔네요!

해당 코드에서 *표시가 많이 쓰였는데

*는 포인터변수선언을 의미합니다. 포인터에 대한 개념은 추후에 포인터강좌에서 자세하게 다루도록하겠습니다.

이번강좌에서는 그냥 "값이 저장된 메모리의 위치를 전달하라!"라는 표시 라고만 생각해주세요!

 

 

그러면 문자배열을 전달하려면 어떻게 해야할까요?

#include <stdio.h>

void func(char str[]){ //[]으로 배열값 전달받을 수 있습니다.
    printf("%s", str);
}

int main(){
    char str[15] = "dpBlog-Good"; //단일문자배열 선언
    func(str);
}

결과값

오!! 문자배열이 정상적으로 잘 전달되었네요!!

 

 

 

마지막으로 한번 저가 코드를 짜봤는데

분석해보면서 스스로도 코드를 짜보세요~!

#include <stdio.h>

void func(char str[], int i){
    printf("%s\n%d", str, i);
}

int main(){
	// vscode에서하시는분들중에서
    // 한글이 깨진다 하시는분들은 Terminal창에다가
    // "chcp 65001" 이라고치고 다시실행해보세요!
    // 해당 명령어는 "utf-8"로 인코딩하라는 명령어입니다!
    char str[30] = "Finally End ㅠㅠ";
    int Integer = 3;
    func(str, Integer);
}

결과값

 

 


 

 

이렇게 끝내보았는데요

궁금한분 있으시면 댓글로 질문주세요

다음강좌는 "연산자"입니다!

감사합니다~

728x90

댓글