C언어 함수 선언 매개변수 - ceon-eo hamsu seon-eon maegaebyeonsu

C언어 함수 기초 사용자 정의 함수, 함수정의, 리턴, 매개변수

C언어뿐만 아니라 java, python, c++ 등등... 여러 가지 프로그래밍 언어를 공부를 할 때 필수적으로 나오는 게 바로 함수이다.

우리가 함수(function)라는 단어를 처음 접할때가 아마... 중학생이었나?? 뭐 대충 그랬던 거 같다.

그때 배운게 y=f(x) 이건대 대충 비슷한 의미라 볼 수 있겠다.

c언어는 기본적으로 main()함수를 가지고 있고 표준 함수와 사용자가 직접 만들어 사용하는 사용자 정의 함수가 있다.


표준함수

표준 함수는 컴파일러에 의해 기본적으로 제공되는 함수를 말하는데 기본적으로 c언어에서는 입력과 출력을 해주는 scanf(), printf()가 있다.

표준 함수를 사용하기 위해서는 표준 헤더 파일을 작성해야 되는데 그것이 c언어 작성할 때 맨 위에 작성하는

#include <stdio.h>이다.. h의 형식으로 정의되어 있고 stdio.h는 앞서 말한 입출력 함수를 제공한다.

또 난수 관련 함수인 rand(), srand()는 stdlib.h에 포함되어 있고 문자열 함수는 string.h 에 포함되어 있다.

사용자 정의 함수. 함수의 형식

사용자 정의 함수는 사용자가 직접 작성해서 사용하는 함수이다.

함수의 형식은 main()에서 호출하기 전에 정의되어 있거나 혹은 프로토타입을 먼저 선언해 줘야 한다. 

예를 들어 function이라는 함수를 작성한다고 했을 때

void function() 	//함수 헤더
{
  본체;
}

main()
{
  fucntion();	 //함수호출
}

이렇게 함수가 먼저 작성되고 main함수가 작성되거나

void function(); 	//함수프로토타입선언
main()
{
  function();  	//함수호출
}
void function() 	//함수헤더
{
 본체;
}

이렇게 프로토타입으로 먼저 선언을 해줘야 한다. 즉 main()에서 호출하기 전에 정의되어 있거나 선언되어 있어야 오류가 나지 않는다. 

프로토타입을 선언함으로써 함수의 정보를 컴파일러에게 미리 전달하는 것인데 두 가지 방법에서 본인 편한 대로 하면 된다.

하지만 함수가 많아지면 main() 위에 함수가 여러 개 쌓여서 코드 보기가 지저분해지기도 하고 함수를 일목요연하게 볼 수 있게 프로토타입을 선언을 하는 것을 추천한다.

함수 정의와 호출

자.. 그리고 함수 정의하는 법부터 자세히 알아보자.

함수는 헤더와 본체로 이루어져 있는데 먼저 헤더로는 반환 타입 함수명(매개변수)으로 이루어져 있다.

앞서 예시를 든 void가 그 자리에 있는데 반환하는 값이 없다는 의미다.

즉 return값이 없다는 뜻. 호출한 곳에 값을 돌려주지 않는다는 것이다.

뭐 간단하게 보자면

#include<stdio.h>
void function(); 	//프로토타입선언

main()
{
	function(); 	//함수호출
}

void function()
{
	printf("hello");
}

결과

hello

이런 것이다. 그러면 매개변수는 무엇인지 반환 타입이 있을 때는 어떻게 작용하는지 보자.

#include<stdio.h>;
int function(int, int); //프로토타입 자료형만 표시
main()
{
	int a = 10, b = 10;		//변수 a, b를 선언하고 각각 10으로 초기화한다.
    printf("%d ", function(a, b); 
  
  //function 함수에 a, b값을 보내 호출하고 리턴값을 printf()로 출력한다.
}
int function(int x, int y)	//int 형식의 변수 2개를 받아서 x, y 값에 넣어준다.
{
	int sum; 	// 함수 내 지역변수 main()에서는 사용할 수 없다.
    sum = x + y;	 //sum변수에 받은 x, y값을 더해서 저장해준다.
    
    return sum;	 //sum 변수값을 리턴시킨다.
}

결과

20

int function(int x, int y)에 맨 앞에 int가 반환 형식이다. 즉 함수 내에서 처리를 하고 리턴 시켜주는 값의 데이터형이 정수(integer) 값이다.

(int x, int y)를 매개변수라 하는데 함수를 호출할 때 int형식의 변수 두 개를 받아서 데이터 처리를 한다는 의미이다.

이때 함수에서는 매개변수로 받는 데이터 형식과 데이터 개수가 호출할 때 보내는 변수의 데이터 형식, 개수 일치해야 한다.

마찬가지로 반환 타입이 int니 return값도 int여야 한다.

이밖에도 리턴 시킬 때 곧바로 return (x+y) 이런 식으로 수식을 리턴 시킬 수도 있고 변수가 아니라 상수를 리턴 시켜도 되는 다양한 방법이 존재한다.

이 정도만 알면 함수의 기초 정도는 알 것이라 생각한다. 미흡한 설명이 많았으나 함수를 공부할 때쯤이면 프로그래밍 기초는 알 테니 이 정도 설명이면 충분한 거 같다.

안녕하세요 오늘은 C언어에서 사용자함수를 정의 할 때 매개변수에 *를 넣을때와 안넣을 때 차이점을 알아보겠습니다

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

#include<stdio.h>

int noChange(int i)

{

i=100*i;

return i;

}

int change(int *i)

{

*i=200*(*i);

return *i;

}

int main()

{

int a= 1;

int b= 1;

printf("noChange 함수 호출 리턴 값 : %d \n", noChange(a));

printf("change 함수 호출 리턴 값 : %d \n", change(&b));

printf("int형 변수 a 값 : %d \n", a);

printf("int형 변수 a 값 : %d \n", b);

}

위의 코드에서 noChange함수의 매개변수는 int i고 change함수의 매개변수는 int *i입니다

5번째 줄 : 전달받은 매개변수에 *100을 하고있습니다

6번째 줄 : *100을 한 값을 리턴합니다 

11번째 줄 : 전달받은 매개변수에 *200을 하고 있습니다. 

*i=200*(*i);

여기서 *i로 쓴 이유는 i는 주소값을 의미하고, *i는 주소값에 있는 값을 의미해서 *로 쓰고 연산을 한 것 입니다.

12번째 줄 :  *200을 한 값을 리턴합니다

마찬가지로 *i로 쓴 이유는 i의 주소값에 있는 값을 리턴하기 위함입니다

19번째 줄 :  noChange함수의 리턴한 값을 호출합니다

20번째 줄 : change함수의 리턴한 값을 호출합니다. 전달인자에 &b로 쓴 이유는 change함수의 매개변수가 포인터형 이여서입니다

22번째 줄 : 변수 a값을 출력하빈다

23번째 줄  : 변수 b값을 출력하빈다 

코드 실행결과

noChange 함수 호출 리턴 값 : 100

change 함수 호출 리턴 값 : 200

int형 변수 a 값 : 1

int형 변수 b 값 : 200

변수 a의 값은 안변하고 변수 b의 값을 변한 것을 볼 수 있습니다

그 이유는 noChange의 함수의 매개변수는 단순히 변수의 값만 복사해서 사용했는데, change함수의 매개변수는 주소값을 이용해서 사용했습니다

change함수의 매개변수는 주소값에 있는 값을 바꿨으므로 실제 b의 값이 변한 것 입니다

결론 : 매개변수에 *로 선언되어있으면, 함수를 호출할 때 그 값이 변한다

- 매개변수가 배열인경우

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

#include<stdio.h>

typedef struct item

{

char one;

char two;

}item;

typedef struct user

{

item it;

}user;

void seeItem(user *us)

{

printf("one : %c \n",us->it.one);

printf("two : %c \n",us->it.one);

}

int main()

{

user oneone;

oneone.it.one = 'A';

oneone.it.two = 'A';

seeItem(&oneone);

}