[C] 구조체와 포인터 [박은종 쌤의 포인터 강의]
Programming/C language

[C] 구조체와 포인터 [박은종 쌤의 포인터 강의]

목차

C언어 포인터 / 박은종 쌤의 포인터 강의 6~7

- 구조체와 포인터 - 1

- 구조체와 포인터 - 2

 


C언어 포인터 / 박은종 쌤의 포인터 강의 6~7

구조체와 포인터 - 1

헤더 파일 선언

해당 헤더파일에 각종 헤더를 include 해주면 이 헤더만 가져오면 그 안에 include 된 모든 헤더 파일을 사용할 수 있다.

 

구조체 헤더파일

 

strcpy로 해당 구조체의 요소 값을 변경시킨다

(strcpy 사용을 위해 헤더 파일에 string.h를 추가해준다)

 

sturct person lee를 선언하는 순간

해당 구조체의 메모리 요소만큼 메모리를 잡게 된다

 

구조체 포인터 선언 struct person* leePtr;

해당 포인터 값은 4바이트의 메모리를 가진다

 

typedef int INT; 를 해줬기 때문에

INT num = 10; 형태로 선언해줄 수 있다.

(INT의 의미는 int)

 

 

구조체와 포인터 - 2

 

변수안의 변수는 stack 메모리에 할당하게 된다.

malloc의 경우는 heap이라는 동적 메모리에 잡히게 된다.

함수가 끝나더라도 남아있기 때문에 free로 꼭 지워줘야 한다.

 

 

void printStruct함수는 포인터를 사용해, 해당 구조체를 출력하는 함수이다.

 

주소만 넘기지 않고 아래처럼 넘기면

printStruct(lee);

printStruct(Person p);

형태로 받게 되면 copy 하여 할당되기 때문에, 새롭게 메모리를 잡게 된다.

 

메모리 낭비를 줄이기 위해 &lee 해당 주소 값을 넘겨줘

Person *p 포인터 형태로 받게 한다.

 

 

배열을 선언할 때 

아래처럼 포인터 형태로도 선언이 가능하다.

 

 

특징으로는 55줄을 보면, 메모리 allocation 이후 arr을 free 해주려고 하면 error가 발생하게 된다.

왜냐하면 arr++하여서 해당 포인터를 옮겨 주었기 때문이다.

 

이런 경우를 위해, malloc에 할당하고 나서 해당 위치에 가리키고 있는 부분을 미리 포인터로 

해당 배열의 시작점의 주소를 받아와야 한다.

(int *temp부분)

 

해당 배열을 모두 사용하고 나서

*temp가 가리키고 있는 부분을 free 해준다.