포인터를 통하여 구조체나 변수에 접근하는 것은 매우 많이 사용되는 방법이다. Type에 상관없이 포인터를 선언하는 방법은 아래와 같이 동일하다.
Type *변수명;
예를 들어, 다음 예제는 s_type이라는 구조체를 정의하고 두 개의 변수를 선언한다. 첫번째 변수 s는 s_type의 구조체 변수이고, 두번째 변수 p는 s_type의 구조체 포인터 변수이다.
struct s_type {
int i;
char str[80];
} s, *p;
이와 같이 정의된 경우, 다음 문장은 s의 주소를 p에 치환한다.
p = &s;
p가 s의 주소값(&)을 가리키고 있으므로, p를 통하여 s에 접근할 수 있다. 그러나 p를 이용하여 s의 각 원소를 접근하기 위해, 도트연산자(.dot operator)를 사용할 수 없다. 대신에, 다음 예와 같이 화살표 연산자(-> arrow operator)를 사용해야 한다.
p->i = 1;
cf> 도트 연산자는 구조체 포인터 변수가 아닌 구조체 변수의 원소에 접근할 때 사용
상기의 코드는 p를 통하여 s의 원소 i에 값 1을 치환한다. 화살표 연산자는 -기호와 >기호를 같이 써서 나타낸다. 두 기호 사이에 공백이 있으면 안된다.
* 구조체 포인터 변수를 사용하는 이유.
- 구조체 변수를 선언하여 포인터나 화살표 연산자 없이 도트 연산자를 이용하면 될 듯한데, 굳이 구조체 포인터 변수를 사용해 혼란스럽게 하는 이유는 뭘까?
==> c는 구조체 전체를 함수에 전달할 수 있다. 그러나, 구조체의 크기가 클 경우, 함수의 파라미터나 리턴값을 통한 구조체의 전달이 프로그램의 실행속도를 현저하게 감소시킬 수 있다(스택 사용). 이러한 이유 때문에 큰 구조체를 사용할 때 구조체 자체를 전달하는 것 대신에 구조체 변수의 포인터 전달이 가능한 상황에서는 포인터를 전달하는 것이 속도면에서 훨씬 좋다.
* 결론
- 구조체 변수를 이용하여 구조체 원소에 접근할 때, 도트연산자를 사용하라.
- 포인터를 사용하여 구조체 원소에 접근할 때는, 화살표 연산자를 사용하라.
'프로그래밍' 카테고리의 다른 글
strlen 함수에 대해 (0) | 2008.04.25 |
---|---|
ssize_t, size_t 그리고 pid_t (0) | 2008.04.25 |
exit() 함수의 뜻 (0) | 2008.04.25 |
scanf함수로 문자열 입력받는 방법 (0) | 2008.04.25 |
fgets함수로 입력받을시 엔터키 지우는 방법 (0) | 2008.04.25 |