-
C언어 구조체 멤버로 사용되는 포인터Visual Studio/C 기초 2012. 9. 7. 11:25
포인터가 C에서 아주 중요하다는 사실을 아신다면 구조체와 함께 사용이 가능하다는 사실도 아실겁니다 :)
struct data {
int *value;
int *rate;
} first;
이 문장은 int형에 대한 2개의 포인터를 멤버로 가지는 구조체를 정의하고 선언합니다. 다른 모든 포인터에서와 마찬가지로 포인터를 선언하는 것만으로 사용할 수는 없습니다. 포인터에는 변수의 주소를 할당하여 포인터가 어떤 영역을 지정하도록 초기화 해야 합니다. 그럴 땐 마침표 (.)를 이용하면 됩니다.
first.value = &cost; //first.value 는 cost에 저장된 값을 뜻하게 됩니다.
또한 메모리를 효율적으로 사용하기 위해 char형에 대한 포인터를 선언하고 문자열을 가리키도록 초기화 시킬 수 있습니다.
char *p_message;
p_message = "낙락장송s의 프로그래밍 정복";
---------------------------------------------
struct msg{
char *p1;
char *p2;
}ptrs;
ptrs.p1 = "낙락장송s는"
ptrs.p2 = "잘생겼다." //죄송합니다
메모리 영역을 차지하는 장소는 사용자가 인식할 필요가 거의 없기 때문에 생략하도록 하겠습니다.
한가지 의문이 생기는데요, 구조체 멤버로 char형의 배열을 사용하는 것과 char형에 대한 포인터를 사용하는 것의 차이점은 무엇일까요? 두 가지 모두 구조체에 문자열을 저장하기 위한 방법입니다.
struct msg {
char p1[30];
char *p2;
}ptrs;
strcpy(ptrs.p1, "낙락장송s는");
strcpy(ptrs.p2, "잘생겼다"); //거듭 죄송합니다
puts(ptrs.p1);
puts(ptrs.p2);
두 가지 방법, 즉 배열 p1과 포인터 p2의 실제 차이점은 무엇이냐면, 구조체 멤버로 배열을 선언하여 문자열을 받을 경우 입력 받을 수 있는 글자 수가 수동적이라는 것입니다. 거기다 입력받을 수 있는 메모리 할당영역을 다 채우지 못할 경우 저장 영역이 낭비됩니다. 반면에 포인터는 글자 수가 제한되어 있지 않습니다. 그래서 전 포인터가 좋습니다 ;)
이제 구조체에 대한 포인터를 설명 드릴텐데, 지금까지 구조체 안에서 포인터를 선언하는 방법에 대해 알아보았습니다. C에선 다른 어떤 데이터형에 대한 포인터와 마찬가지로 구조체에 대한 포인터를 선언하고 사용할 수 있습니다.
struct part{
int num;
char name[10];
};
struct part *p_part; //여기서 *는 part형 구조체 변수가 아닌 part형 구조체에 대한 포인터라는 사실임에 주의하시기 바랍니다.
여기서 문제는 구조체 part는 정의되었으나 어떤 구조체 변수도 선언되지 않았기 때문에 포인터 초기화가 불가능합니다. 초기화하기 위해서 메모리 내의 저장영역을 할당하는 변수 선언문이 필요한데, 포인터가 어떤 주소를 가리키도록 하기 위해서 part형 구조체 변수를 선언해야 합니다.
struct part ppp;
이제 포인터를 초기화 할 수 있습니다.
p_part = &ppp;
이제 이 포인터를 사용해야 하는데 한 가지 방법은 *를 이용하는 것입니다. 만약 ptr이 데이터 객체에 관한 포인터라면 수식 *ptr은 포인터가 가리키는 변수의 값을 참조합니다.
이제 ppp의 각 멤버를 사용하기 위해서 (.)를 사용하면 됩니다. ppp.num에 100의 값을 저장하기 위해 (*p_part).num=100; 을 사용하면 됩니다.
여기서 (.)는 *보다 높은 우선 순위를 가지고 있기 때문에 *p_part는 괄호 내에 포함되어야 합니다.
두 번째 방법은 ->(하이픈과 부등호)로 구성되는 간접 멤버 참조 연산자를 사용하는 것입니다. 용어가 어렵죠? ->를 함께 사용하면 C에서 하나의 새로운 연산자로 간주됩니다. p_part를 사용하여 ppp의 num을 참조하기 위해서 p_part->num 을 적어줍시다.
구조체의 포인터와 배열
struct part {
int number;
chr name[10];
};
struct part data[100];
struct part *p_part;
p_part = &data[0]; //또는 p_part = data;
part형 구조체의 배열과 배열의 첫 번째 구조체에 대한 포인터를 생성했는데요, 첫 번째 요소의 내용을 출력하기 위해선
printf("%d %s", p_part->number; p_part ->name); 을 써주면 됩니다. (저도 여기서 많이 헤맸습니다 ㅠㅠ)
이제 모든 요소를 출력하려면 반복문을 사용해주면 됩니다.
지금까지 설명해드린 내용을 바탕으로 프로그램을 하나 만들어보겠습니다.
#include <stdio.h>
struct part {
int num;
char name[10];
}data[4] = {1, "철수", 2, "영희", 3, "바둑이", 4,"영숙이"};struct part *p_part;
int count;main() {
p_part = data; //포인터입니다.
for(count = 0; count < 4; count++)
{
printf("메모리 주소 %d : %d %s\n", p_part, p_part->num,p_part->name);
p_part++;
}}
다음엔 변수에 대해 좀 더 자세히 알아보겠습니다.
'Visual Studio > C 기초' 카테고리의 다른 글
C언어 반복문제어 (break, continue, goto) (0) 2012.09.08 C언어 변수의 범위 (0) 2012.09.07 C언어 구조체와 배열 (0) 2012.09.06 C언어 구조체의 기본 (2) 2012.09.06 C언어 문자와 문자열, 문자열과 포인터, malloc() (0) 2012.09.05