구조체 포인터에 대해서
조회수 2361회
struct Person {
char name[20];
int age;
char address[100]
};
int main
{
struct Person p1;
struct Person *ptr;
ptr = &p1;
}
int main에서 세번쨰 줄이 없어도 두번쨰줄에서 이미 변수 ptr이
p1의 메모리 주소를 갖기떄문에 세번쨰 줄이 없어도 되지 않나요??
2 답변
-
아마 배열이나 다른 언어랑 헷갈리신거 같습니다.
구조체랑 구조체 포인터는 다른 형태의 변수입니다.
확인할 수 있는 간단한 코드를 짜 보았습니다.
#include <stdio.h> struct Person { char name[20]; int age; char address[100]; }; int main(void) { struct Person p1; struct Person *ptr; char character; int integer; ptr = &p1; printf("size of p1 : %ld\n",sizeof(p1)); printf("size of ptr : %ld\n",sizeof(ptr)); printf("size of char : %ld\n",sizeof(character)); printf("size of int : %ld\n",sizeof(integer)); }
해당 코드를 실행해보시면 다음같은 결과가 출력될것입니다.
size of p1 : 124 size of ptr : 8 size of char : 1 size of int : 4
보시면 p1과 ptr변수의 크기가 다른것을 볼 수 있죠?
ptr은 포인터형 이기 때문에 8byte의 크기를 갖습니다.
반면, p1은 구조체 내부 구조를 전부 담을 수 있게 char 20개, int 1개 그리고 char 100개 의크기를 더한 124byte의 크기를 갖게 됩니다. [ (1x20) + (4) + (1x100) = 124byte ]
그리고 이후 코드에서 구조체 내부에 접근하는 방법도 조금 다를겁니다. 예를 들어 구조체 내부 age에 접근하고자하면 다음과 같은 방법들로 접근할 수 있겠네요.
int method1 = p1.age; int method2 = ptr->age; int method3 = (&p1)->age; int method4 = (*ptr).age;
아 그리고 다음에 질문해주실때는 마크다운 문법을 읽고 작성해주세요 그편이 보기 좀 더 편하니까요^
-
(•́ ✖ •̀)
알 수 없는 사용자
-
-
struct Person p1; // 스택에 구조체 Person 크기의 메모리를 할당 struct Person *ptr; // 구조체 Person 타입의 포인터 변수 선언 ptr = &p1; // 구조체 포인터에 p1 주소 대입
상기의 3번째 줄이 p1의 메모리 주소를 ptr에 대입하는 겁니다.
댓글 입력