Q & A

함수 안에 선언한 변수를 다른 함수에서 사용할 수 없나요?

함수는 독립된 공간이므로 함수 안에서 선언된 변수는 다른 함수에서 사용할 수 없습니다. 함수 안에 선언된 변수의 값을 다른 함수에서 사용하고 싶다면 반환값과 매개변수를 이용해야 합니다.

만약 반환값과 매개변수를 사용하지 않고 모든 함수에서 공통된 변수를 사용하고 싶다면 전역 변수를 사용하면 됩니다. 전역 변수는 'Unit 78 전역 변수 사용하기'를 참조하세요.

배열 매개변수와 포인터 매개변수의 차이점은 무엇인가요?

함수에서 매개변수를 사용할 때 배열을 사용할 때도 있고, 포인터를 사용할 때도 있습니다.

void hello(char s1[]) { ... }    // 배열 매개변수
void hello(char *s1) { ... }     // 포인터 매개변수

편의상 void hello(char s1[])로 사용하는 것일 뿐 배열 이름은 포인터로 바뀝니다(배열은 수식에서 사용될 때 포인터로 변환됨). 따라서 void hello(char s1[])로 사용하더라도 컴파일러는 포인터로 인식하여 void hello(char *s1)이 됩니다.

보통 함수 바깥에서 인수로 받은 값이 배열일 때는 배열로 지정해주고, 포인터일 때는 포인터로 지정해주는 식으로 사용합니다.

// 배열과 포인터를 받았다는 것을 확실하게 표현
void generateString(char buffer[], char *str)
{
    sprintf(buffer, "%s", str);
}

int main()
{
    char buffer[20];                // 배열
    char *str = "Hello, world!";    // 포인터

    generateString(buffer, str);    // 배열과 포인터를 넣음
    
    return 0;
}

즉, 사람이 읽기 편하게 코드를 작성하는 것이며 함수 안에서는 char buffer[]도 포인터로 처리됩니다. 즉, generateString 함수에서 sizeof(buffer)를 사용해보면 포인터의 크기가 나옵니다.

void generateString(char buffer[], char *str)
{
    printf("%d\n", sizeof(buffer));   // 4(32비트): buffer는 포인터로 처리되므로 포인터 크기가 나옴
                                      // 8(64비트)
    sprintf(buffer, "%s", str);
}