본문 바로가기
카테고리 없음

자료구조를 위한 C배열과 포인터 이해(4)

by 데일리J형 2022. 5. 2.

자료구조를 구현할 때, C의 포인터 변수는 자료 객체 변수들을 연결하여 자료 객체들의 집합을 나타내거나 자료 객체 변수들을 처리하는 연산 함수를 설계할 때 형식 인수로 사용되고, 이 외에도 동적 변수의 생성 조작을 위해 사용합니다. 자료 구조 프로그래밍에서 많이 활용되는 포인터 변수들의 사용방법을 정리합니다.

 

C의 포인터 이해

함수의 포인터 형식 인수

C 프로그램에서 포인터 변수는 변수 이름 이외의 방법으로 메모리(변수)를 접근할 수 있는 방법을 제공합니다. 변수 이름이 없는 동적 변수들이나 변수 이름을 사용할 수 없는 외부 영역에서 변수를 참조할 때는 포인터 변수를 통해서만 참조할 수 있습니다. 이러한 포인터 변수를 통한 변수 참조는 특히 C의 함수 정의에서 많이 사용됩니다. 

 

C에서 어떤 함수 a()가 다른 함수 b()에서 정의된 변수 (예를 들면, int x)를 참조해서 그 값을 변경하려면, 참조할 변수 x의 주소를 저장할 수 있는 포인터 변수(예를 들면, int *p)를 함수 a()의 형식 인수로 정의하고, 함수 b()가 함수 a()를 호출할 때 참조될 변수 x의 주소를 형식 인수 p에 전달하면 됩니다. 그러면 함수 a()에서는 직접 변수명 x는 사용할 수 없지만 형식 인수인 포인터 변수 p를 통해 함수 b()의 변수 x를 참조할 수 있습니다. 

 

예를 들면 main() 함수에서 정의된 int형 변수 x, y를 함수 swap()에서 참조하려면 swap()의 형식 인수로 int형 포인터 변수  ptrx, ptry를 정의하면 됩니다. 그러면, 함수 swap()에서는 main() 함수의 변수 x, y를 형식 인수(포인터 변수) ptrx, ptry를 통해 "*ptrx", "*ptry"형식으로 참조할 수 있습니다.

 

 


 

예제 코드 2.2

다른 함수에서 정의된 변수 접근의 예

void main(void){
	int x = 3, y = 5;
    
    printf("호출전: x=%d, y=%d\n", x,y);
    swap(&x, &y);
    printf("호출후: x=%d, y=%d\n", x,y);
}
void swap(int *ptrx, int *ptry){
	int temp;
    
    temp = *ptrx;
    *ptrx = *ptry;
    *ptry = temp;
}

 


 

한편, 한 함수 a()가 다른 함수 b()에서 정의된 배열(예를 들면, int x [N])을 참조하려면 C의 배열 특성을 고려하여 배열 x의 시작 주소를 넘겨받는 포인터 변수(예를 들면, int *p)와 배열의 크기(원소 개수)를 전달받는 int형 변수(예를 들면, int n)를 형식 인수로 정의하면 됩니다. 함수 sumArray()는 형식 인수로 int형 포인터 변수 p와 int형 변수 n을 정의했는데, main() 함수에서 sumArray()를 호출할 때 main()에서 정의된 배열 x의 시작 주소(x)와 크기(5)를 인수값으로 전달하면, sumArray() 함수에서는 배열 이름 x는 사용할 수 없지만 형식 인수 p(포인터)와 n(정수)을 이용해서 main()의 배열 x를 p [0], p [1],..., p [n-1]과 같은 형식으로 참조할 수 있습니다. 따라서 sumArray() 함수는 크기 n인 int형 배열 p를 처리하는 것으로 프로그래밍하면 됩니다. 

 

 


 

예제 코드 2.3

다른 함수에서 정의된 배열의 접근 예

void main(void){
	int total, x[5]={ 10, 20, 30, 40, 50};
    total = sumArray(x,5);
    printf("total = %d\n", total);
}
int sumArray(int *p, int n){
	int i, sum = 0;
    for (i = 0; i<n; i++)
    	sum += p[i];
    return(sum);
}

 


 

C 함수를 정의할 때 형식 인수가 배열의 시작 주소를 전달받기 위한 포인터 변수라는 것을 명시적으로 나타내기 위해 형식 인수는 포인터 변수 정의 표현 대신 크기가 생략된 배열 표현으로 나타낼 수도 있습니다. 이런 형식 인수의 배열 형식 표현은 함수의 형식 인수 표현에서만 가능하며, 본질적으로 포인터 변수 선언과 동일합니다. 예를 들면 sumArray() 함수의 선언부는 "int sumArray(int p [], int n)"와 같이 작성해도 되며, 사실 형식 인수가 외부의 배열을 참조하는 경우에는 이러한 표현을 사용하는 것이 더 바람직합니다. 

 

댓글