C Language
함수 매개 변수
수색…
비고
C에서 리턴 값을 사용하여 발생하는 오류를 나타내는 것이 일반적입니다. 전달 된 포인터를 사용하여 데이터를 반환 할 수 있습니다. 이것은 여러 가지 이유로 수행 될 수 있습니다. 힙에 메모리를 할당하거나 함수가 호출되는 지점에서 정적 할당을 사용하지 않아도됩니다.
포인터 매개 변수를 사용하여 여러 값 반환
함수에서 여러 값을 반환하는 것을 모방하기 위해 C의 일반적인 패턴은 포인터를 사용하는 것입니다.
#include <stdio.h>
void Get( int* c , double* d )
{
*c = 72;
*d = 175.0;
}
int main(void)
{
int a = 0;
double b = 0.0;
Get( &a , &b );
printf("a: %d, b: %f\n", a , b );
return 0;
}
배열에 함수 전달
int getListOfFriends(size_t size, int friend_indexes[]) {
size_t i = 0;
for (; i < size; i++) {
friend_indexes[i] = i;
}
}
/* Type "void" and VLAs ("int friend_indexes[static size]") require C99 at least.
In C11 VLAs are optional. */
void getListOfFriends(size_t size, int friend_indexes[static size]) {
size_t i = 0;
for (; i < size; i++) {
friend_indexes[i] = 1;
}
}
여기 함수 매개 변수의 []
안의 static
은 인자 배열이 최소한 (즉, size
요소와 같은) 많은 원소를 가져야한다고 요청합니다. 이 기능을 사용하려면 size
매개 변수가 목록의 배열 매개 변수 앞에 오는 지 확인해야합니다.
getListOfFriends()
과 같이 사용하십시오 :
#define LIST_SIZE (50)
int main(void) {
size_t size_of_list = LIST_SIZE;
int friends_indexes[size_of_list];
getListOfFriends(size_of_list, friend_indexes); /* friend_indexes decays to a pointer to the
address of its 1st element:
&friend_indexes[0] */
/* Here friend_indexes carries: {0, 1, 2, ..., 49}; */
return 0;
}
또한보십시오
매개 변수는 값으로 전달됩니다.
C에서 모든 함수 매개 변수는 값으로 전달되므로 호출 수신자 함수에서 전달 된 것을 수정해도 호출자 함수의 로컬 변수에는 영향을주지 않습니다.
#include <stdio.h>
void modify(int v) {
printf("modify 1: %d\n", v); /* 0 is printed */
v = 42;
printf("modify 2: %d\n", v); /* 42 is printed */
}
int main(void) {
int v = 0;
printf("main 1: %d\n", v); /* 0 is printed */
modify(v);
printf("main 2: %d\n", v); /* 0 is printed, not 42 */
return 0;
}
포인터를 사용하여 호출 수신자 함수가 호출자 함수의 로컬 변수를 수정하도록 할 수 있습니다. 이것은 참조로 전달되는 것이 아니라 로컬 변수를 가리키는 포인터 값 이 전달 된다는 점에 유의하십시오.
#include <stdio.h>
void modify(int* v) {
printf("modify 1: %d\n", *v); /* 0 is printed */
*v = 42;
printf("modify 2: %d\n", *v); /* 42 is printed */
}
int main(void) {
int v = 0;
printf("main 1: %d\n", v); /* 0 is printed */
modify(&v);
printf("main 2: %d\n", v); /* 42 is printed */
return 0;
}
그러나 로컬 변수의 주소를 호출 수신자에게 반환하면 정의되지 않은 동작이 발생합니다. 평생을 넘어 변수에 대한 포인터의 참조 해제를 참조 하십시오.
함수 매개 변수 실행 순서
매개 변수의 실행 순서는 C 프로그래밍에서 정의되지 않습니다. 여기서 왼쪽에서 오른쪽으로 또는 오른쪽에서 왼쪽으로 실행될 수 있습니다. 순서는 구현에 따라 다릅니다.
#include <stdio.h>
void function(int a, int b)
{
printf("%d %d\n", a, b);
}
int main(void)
{
int a = 1;
function(a++, ++a);
return 0;
}
오류 코드와 함께 값을 포함하는 구조체를 반환하는 함수의 예
값을 반환하는 함수의 대부분의 예제는 함수가 다음과 비슷한 값을 수정할 수있게하는 인수 중 하나로서 포인터를 제공합니다. 함수의 실제 반환 값은 일반적으로 결과의 상태 (작동 여부와 상관없이)를 나타내는 int
와 같은 유형입니다.
int func (int *pIvalue)
{
int iRetStatus = 0; /* Default status is no change */
if (*pIvalue > 10) {
*pIvalue = *pIvalue * 45; /* Modify the value pointed to */
iRetStatus = 1; /* indicate value was changed */
}
return iRetStatus; /* Return an error code */
}
그러나 struct
를 반환 값으로 사용하여 다른 상태 값과 함께 오류 상태를 반환 할 수도 있습니다. 예를 들어.
typedef struct {
int iStat; /* Return status */
int iValue; /* Return value */
} RetValue;
RetValue func (int iValue)
{
RetValue iRetStatus = {0, iValue};
if (iValue > 10) {
iRetStatus.iValue = iValue * 45;
iRetStatus.iStat = 1;
}
return iRetStatus;
}
이 함수는 다음 예제와 같이 사용할 수 있습니다.
int usingFunc (int iValue)
{
RetValue iRet = func (iValue);
if (iRet.iStat == 1) {
/* do things with iRet.iValue, the returned value */
}
return 0;
}
또는 다음과 같이 사용할 수 있습니다.
int usingFunc (int iValue)
{
RetValue iRet;
if ( (iRet = func (iValue)).iStat == 1 ) {
/* do things with iRet.iValue, the returned value */
}
return 0;
}