쑤쑤_CS 기록장
[TIPS 20기]7. C언어 일곱번째 강좌 정리 본문
안녕하세요!
사실 제 일정이 꼬여서,,,, 팁스 강좌 정리가 많이 밀렸습니다 ㅠㅠ
그래도 일단 최근 수업의 것 부터 해서 차근차근 (순서는 뒤죽박죽 이지만) 올려보겠습니다!ㅎㅎ
[ 수업 전, <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
'IT 지식 기록 > TIPS - C 언어 수업 정리' 카테고리의 다른 글
[TIPS 20기]11. Windows 첫번째 강좌 정리 (0) | 2019.02.14 |
---|---|
[TIPS 20기]2. C언어 두번째 강좌 정리 (0) | 2019.02.13 |
[TIPS 20기]3. C언어 세번째 강좌 정리 (0) | 2019.02.07 |
[TIPS 20기]8. C언어 여덟번째 강좌 정리 (0) | 2019.01.28 |
[TIPS 20기]1. C언어 첫번째 강좌 정리 (0) | 2019.01.16 |