본문 바로가기
관/솔직한 c 언어 공부

구조체와 포인터 알기 (2020ver).

by 4차원 박스 2020. 8. 6.

이번에는 C에서 구조체를 포인터와 사용하는 방법을 소개한다.

길게 써놓았으니 필요한 내용은 대부분 들어있다고 생각한다!

<구조체로 데이터를 묶기>

자료형은 정수, 문자 여기서 추가적으로

배열(문자열), 포인터(주소), 구조체(연관된 데이터 모으기, 숫자든 문자든 상관없이) 가 있다.

 

구조체 멤버접근 에는 멤버 연산자 (.) 를 사용한다

구조체 상에서 선언된 마우스의 xy축 등은 멤버라 한다.

 

구조체와 객체지향(oop)에서의 클래스의 차이점 이라면

구조체는 변수까지만 저장이 가능하다. 즉 함수는 저장이 불가능 한데

클래스 에서는 함수까지 저장이 가능하다는 것이 핵심이다.

 

구조체의 멤버가 배열일때

s.name="이름";

이런 방식으로 하면 오류가 난다.

배열은 주소값을 가지기 때문이다.

 

strcpy(s.name,"이름");

이런 방식으로 해준다

구조체는 중괄호를 통해 바로 초기화 가능하다

 

struct student s1 = {23, "park", 4.5};

이때 배열에서 초기화하듯이 바로 가능하다.

 

구조체를 선언하고 변수를 몇개 만들어서

p1,p2 라는 변수가 있을때

 

p2=p1; 은 가능하지만

if(p1==p2) 는 불가능 하다.

그릇만 보아서는 비교가 불가능 하다는 의미이다

그 내용, 즉 멤버가 같은지를 확인해야 된다.

 

if((p1.x==p2.x)&&(p1.y==p2.y))

이러한 조건일 때 비교가 가능하다는 의미이다.

 

구조체를 만들 때 다음같이 만들 수 도 있다.

 

typedef struct _point

{

int x;

int y;

} point;

 

로 선언하고

사용할 때는

point p1; 이런 식으로 선언하여 사용 가능하다.

 

이 방법으로 주로 많이 사용한다.

 

구조체 배열

구조체를 만든뒤에

메인에서 사용할때 변수를 배열로 선언한다.

 

구조체를 가리키는 포인터는 변수를 포인터로 만들고

&로 할당해주면 되는것이다.

 

-> 연산자는

포인터를 이용하여 구조체 변수를 선언할 때

멤버에 접근하려면 이때는 . 연산자가 아닌 -> 연산자를 사용하여

멤버에 접근을 한다.

 

<점(.) 연산자와 포인터(->) 연산자의 차이>

전자는 구조체에서 많이 보이는데

멤버 연산자 라고도 한다.

구조체 변수의 멤버에 접근할 때 사용한다.

구조체 뿐만 아니라 함수나 클래스에서도 사용한다.

 

후자는 포인터를 이용하여 구조체 변수를 선언할때

멤버에 접근하려면 이때는 . 연산자가 아닌 -> 연산자를 사용하여

멤버에 접근을 한다.

 

구조체를 일반적으로 선언시 .로 멤버에 접근

p1.x 같이

 

구조체를 포인터를 사용하여 선언시 ->로 멤버에 접근

p1->x 같이 사용함

 

아니면 (*p1).x 같이 사용가능 하다.

구조체의 일반변수를 함수의 인자(argument)로 사용할 경우

구조체의 복사본이 함수로 전달되어

그 만큼의 시간과 메모리가 소요되지만

 

구조체의 포인터를 함수의 인자로 전달할 경우에

메모리 공간과 시간을 절약 가능성이 있지만

원본 구조체가 훼손될 가능성이 있다.

댓글