쑤쑤_CS 기록장

[TIPS 20기]7. C언어 일곱번째 강좌 정리 본문

IT 지식 기록/TIPS - C 언어 수업 정리

[TIPS 20기]7. C언어 일곱번째 강좌 정리

(╹◡╹)_ 2019. 1. 24. 17:51
728x90


안녕하세요!


사실 제 일정이 꼬여서,,,, 팁스 강좌 정리가 많이 밀렸습니다 ㅠㅠ

그래도 일단 최근 수업의 것 부터 해서 차근차근 (순서는 뒤죽박죽 이지만) 올려보겠습니다!ㅎㅎ



[ 수업 전,  <Q&A>시간 ]

Q : c언어에서 '초기화'가 존재하는 이유?

A : 상수 변수 const 선언을 위해



[ 추가로 한 my정리 ]

수업시간에 계속 "메모리 구조"에 대한 내용이 나오더라구요.

저도 잘 모르고 있던 것 같아서 검색을 통해 내용을 조금 정리해보았습니다 :)



<메모리 구조>

- 프로그램을 실행시키면 운영체제는 우리가 실행시킨 프로그램을 위해 메모리 공간을 할당해준다.

- 할당되는 메모리 공간은 크게 스택Stack, 힙Heap, 데이터Data 영역으로 나뉘어진다.

     - 할당 용도 : 프로그램 실행 시 필요한 메모리 공간 할당


데이터 영역 : 전역 변수와 stack 변수가 할당되는 영역

프로그램의 시작과 동시에 할당되고, 프로그램이 종료되어야 메모리에서 소멸됨

스택 영역 : 함수 호출 시 생성되는 지역 변수와 매개 변수가 저장되는 영역

함수 호출이 완료되면 사라짐

힙 영역 : 필요에 의해 동적으로 메모리를 할당할 때 사용

(할당해야 할 메모리의 크기를 프로그램이 실행되는 동안 결정해야 하는 경우 유용하게                                         사용되는 공간)




[ 본격적인 강의 정리 ]



<16-3> 동적 메모리 할당 및 해제

스스로 메모리를 가지고 동작하는, 자생형 포인터

동적 메모리 할당

+ 원하는 시점에 원하는 크기만큼 힙에 메모리 할당 가능

+ 메모리 사용이 끝나면 언제든지 할당한 메모리 해제 가능

+ Giga byte 단위까지 할당 가능


* malloc 함수로 동적 메모리 할당하기

malloc : memory allocation

+ void * 형식으로 주소를 반환

+ 할당된 메모리 주소를 받는 시점에 미리 형 변환하여 사용

- free 함수로 할당된 메모리 해제하기

- malloc 사용시 바로 free(p); 를 같이 써서 잊어버리지 않도록

- free가 더 많으면 프로그램이 죽으므로(오류 발생), 쌍을 잘 맞추어서 사용해야 한다

+ malloc 함수를 사용할 때 주의할 점 :

1. 동적 할당된 메모리를 해제하지 않으면 함수가 호출될 때마다 메모리가 할당되어 힙 영역에 누적됨

2. 동적 할당된 메모리의 주소를 잃어버리면 메모리 손실 발생

- 동적 메모리 할당의 단점 : 작은 메모리를 동적 메모리 할당으로 반복하면, 메모리가 조각나서

  나중에 속도가 많이 떨어지게 된다

배열 : 예상 가능한 최대 크기 할당 / 포인터 : 사용자에게 받아들임



<17. 다차원 포인터> == 다단계 포인터

* 다차원 포인터란?

1단계 포인터를 가르키는 2단계 포인터

+ 간접으로 여러 번 대상을 가리키는 포인터

+ 차원은 '자신이 가리키는 대상'의 개수만큼 증가


다차원 포인터 정의하기

+ 포인터 변수 선언 시 *키워드를 추가할 때마다 차원이 하나씩 증가

+ * 키워드를 두 개 이상 사용한 포인터가 '다차원 포인터'

+ 포인터 변수 선언 시 사용한 * 키워드 개수만큼 포인터를 사용할 때 * 연산자를 사용 가능

이중 포인터

중간 단계에 주소를 저장하기 위한 (꼭 포인터가 아니더라도) 4byte 가 필요



( 추가설명 )------------------------------------------------------------------------------------------------------

int *p[5]; //포인터 5개 필요할 때

여기에 포인터를 하나 더 사용하여 6개를 사용할 때?

현재 포인터는 stack에서 사용

포인터 개수에 변화가 오면 무조건 다시 바꿔야 되는 방법 뿐 이다.

-> 포인터를 heap에 갖다 놓을 수 있다면?!

int *p[5]; // = p[0], p[1]

int **p = malloc(4*5); // = *(p+0), *(p+1)


stack에 있던 포인터를 heap으로 옮기기 위해 : 2단계 포인터가 필요한 진짜 이유!


int data;데이터 변수의 주소를 알기 위해? 방법 2

int *p = &data; //추가로 *p = 3; 가능

int tmp = (int)&data //값을 사용할 수 없음 -> Solution 2단계 포인터

int **p = &tmp; //tmp의 주소를 p가 가짐. 

//p->tmp->data 가르킴. p는 포인터 이므로 tmp의 값 변경 가능. tmp는 포인터                                                 아니므로 data값 가르킬 수 없음

2단계 포인터는 스스로 주소를 건너가는 개념. 1단계 포인터가 있든지 4byte의

  메모리든지 상관 없음. 그 메모리에 주소가 있으면 된다.

3단계 포인터는 중간에 오는 두 개 4바이트의 메모리면 된다. 3단계 포인터의 힘

  으로 오는 것

int **p = malloc(4); //4바이트의 메모리를 찍고 어디로 가겠다

int *p = malloc(4);

구조체를 배우기 전, 단계 포인터 int **p = malloc(4*5);가 정석이다 :)

int **p = (int *)malloc(sizeof(int *)*5) //똑같은 4바이트 라고 하더라도 int 말고 int                                                 *포인터 사용하기.

포인터 크기는 단계와 상관 없이 4 이다. 무조건 한개의 메모리를 저장한다.

-> 단계 포인터는 포인터를 heap으로 옮기기 위해 만들어졌다. 왜? 밑에 4byte 메모리만

있므면 이용 가능하니까.

융퉁성은 극대화 되지만, 느려진다. (for문을 돌면서 찾는것임) 소스 코드는 짧지만 기계어

   코드는 엄청 복잡해질 수 있다.


추가설명 끝 )--------------------------------------------------------------------------------------------------------------



<18 구조체와 연결 리스트>


* 구조체 : user defined data type 사용자 정의 데이터 타입

구조체가 필요한 이유?

데이터 구조화 / 데이터 의미 / 데이터 유지 보수

배열은 동질의 데이터를(같은 type, 크기) 그룹지어 사용한다. (같은 의미의 데이터 들)

구조체는 (다른 의미의 데이터 들.)

데이터를 바라보는 기준이 다르다(배열 : 국어선생님, 국어 과목 점수의 여러 학생들 / 구조체 : 담임 선생님                 또는 학생. 한 학생의 국어, 수학 등 여러 과목 점수)

변화가 왔을 때 최소한의 코드 변화. 유지보수

함수 : 매개변수의 개수가 달라지면 바꿀 수 없다.

유지보수의 약한 부분을 해결. group 시켜셔 변수로 만들어서 data 변화에 구조체 하나로 해결 가능해진다.

* typedef의 의미

type define

이름을 짧게 쓰고자 하는 목적

같은 타입이라도 의미가 다르면 typedef을 쓰는게 맞다

데이터 타입 유지보수를 위해. 지금 데이터 타입의 의미가 나중에 바뀔 수 있다.

* typedef의 장점

1. 복잡해 보이는 문법을 쉽게 표현할 수 있다

2. 자료형의 크기를 쉽게 바꿀 수 있다

* 구조체로 선언한 변수의 요소 사용하기

대 주제. 소주제 의 느낌으로 . 문자를 사용한다

구조체 변수 이름 . 사용할 요소

연산자 우선 순위가 높으므로 신경쓰지 않고 사용해도 된다(포인터보다 높다)

연산자 우선순위 문제를 해결하는 -> 연산자

p->age = 23; // (*p).age =23;과 동일





오늘 수업 사진입니다 ㅎㅎ




노트패드 어플리케이션을 이용하여 필기를 하였더니 색다르네요,,!

너무 설명이 적고 간결형 인가요?? 정리 형식으로는 괜찮은가요??

쨋든,, 남은 기간 팁스 화이팅 입니다!ㅎㅎ








#Tips강좌

#Tips프로그래밍강좌

#김성엽

#지식나눔강좌

#tipssoft





728x90
Comments