<강의 필기>
hexideciaml
16진법 123456789ABCDEF
FF = 255 = 11111111
48 0x48
49 0x49
21 0x21
2개의 16진수는 1byte의 2진수로 변환된다.
full red. full green. full blue = white (255, 255, 255) FFFFFF
no red. no green. no blue = black (0, 0, 0) 000000
red (255, 0, 0) FF0000
green (0, 255 0) 00FF00
blue (0, 0, 255) 0000FF
address
inside of your computer’s memory는 서로를 구별하는 고유한 주소를 가지고 있다.
0x12345678
변수 이름 앞에는 ampersand를 붙인다.
ampersand는 그 변수가 어디 주소에 저장되어 있는가를 말한다.
0x7ffd80792f7c라는 주소가 복잡해서 간단하게 만들어본다.
#include <stdio.h>
int main(void)
{
int n = 50;
printf("%i\n", *&n);
}
pointer
변수의 adrress를 저장한다.
pointer는 우편함과 같다.
우편함에는 어떤 유형의 파일을 저장한다.
집/회사 주소와 같이 컴퓨터 메모리에도 주소가 있다.
포인터는 특정 주소를 가리키는 변수일뿐, 메모리의 크기는 크게 관련이 없지만,
운영체제에 따라 64bit, 32bit 등으로 달라진다.
int n = 50;
int *p = &n;
p는 address를 저장한 변수이다.
integer n은 50을 0x123 위치에 저장한다.
typedef
C 언어에서는 string이라는 자료형이 없어서
별도로 포인터를 정의하고 배열의 순서를 설정하는 작업이 필요하다.
cs50 cloud shell에서는 c언어와 다르게 typedef char *string이라고 문자열 자료형을 마련했다.
s is at 0x123.
s[0] H 0x123
s[1] I 0x124
s[2] ! 0x125
s[3] \0 0x126
*s는 string pointer를 가리킨다.
address는 첫 번째 byte를 기준으로 한다.
Memory
malloc
변수의 memory allocation을 정의한다.
정해진 크기 만큼 메모리를 heap 영역에 할당한다.
heap overflow
stack overflow라고도 한다.
memory 용량이 heap 영역을 넘어간다.
virtual memory
실행 프로그램 메모리의 크기에 따라 자동으로 확보되는 여유 메모리 공간이다.
valgrind grant
memory leak과 buffer overflow를 확인한다.
메모리 누수가 발생하면 시스템 성능이 낮아진다.
원래 사용할 수 있는 메모리공간을 연산에 사용하지 못하기 때문이다.
free(x)는 leak한 garbage memory를 해제한다.
Memcheck, a memory error detector
HEAP SUMMARY:
in use at exit: 0 bhytes in 0 blocks
total heap usage : 1 allocs, a frees, 4 bytes allocated
All heap blocks were freed — no leaks are possible
swap
파란 물 유리잔. 빨간 물 유리잔. 빈 유리잔.
유리잔에 담긴 파란 물과 빨간 물을 바꾸기 위해서는 빈 유리잔이 필요하다.
교체할 때에는 빈 유리잔에 파란 물 혹은 빨간 물이 차지만
교체한 후에는 빈 유리잔은 다시 빈 유리잔이 된다.
tmp라는 제3의 변수를 메모리에 할당해야 한다.
machin code
-------------
globals
-------------
heap
↓
....
↑
stack
function을 호출하면
stack space에 변수를 저장한다.
copy x와 y를 만들지 않고 swap할 수 있을까?
변수 x와 y의 주소(0x123, 0x127)에 임시 메모리 a와 b를 만들어 바로 swap한다.
#include <stdio.h>
void swap(int *a, int *b);
int main(void)
{
int x = 1;
int y = 2;
printf("x is %i, y is %i\n", x, y);
swap(&x, &y);
printf("x is %i, y is %i\n", x, y);
}
void swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
a와 b를 각각 x와 y를 가리키는 포인터로 지정한다.
이를하지 않으면 a와 x, b와 y는 그 안에서도 서로 다른 위치에 저장된 변수일뿐
서로에게 아무런 영향도 끼치지 않는다.
file I/O
fopen 함수에서 r은 읽기, w는 쓰기, a는 덧붙이기 모드를 불러온다.
fclose 함수로 작업을 종료한다.
copy file
file을 열고 while문을 통해 모든 byte를 iterate하고 마지막에 file을 닫는다.
Image Enhancement
Enhance
화질 개선의 방법으로 점 처리와 영역 처리가 있다.
pixel을 산술적 or 논리적 방법에 의해 변환하는 것을 말한다.
Bitmap
0과 1로 이루어진 네모 pixel의 조합으로 그려지는 이미지 표현 방식이다.
이미지 크기를 늘리거나 줄이면 화질이 손상된다.
Vector
특정한 형태를 수학적 함수로 나타낸다.
적은 데이터 용량으로 이미지 구현이 가능하고 확대나 축소 시에 화질이 유지가 된다.
하지만 복잡한 이미지를 나타낼 수 없어 간단한 도형이나 로고를 그린다.
JPEG
읽어들인 각 바이트가 각각 0xFF, 0xD8, 0xFF 인지를 확인하면
JPEG 형식의 파일이다.
강의 자료
CS50 Sandbox
Binky Pointer Fun Video C (High Quality 640x560)
CSI Zoom Enhance
Futurama Let's Enhance
xkcd : pointers
화질 개선 (Image Enhancement) (Naver Blog bluespace의 블로그)
비트맵과 벡터 (Tistory Blog On a rainy day)
'Doc > 컴퓨터' 카테고리의 다른 글
컴퓨터과학 CS50 2020 Lecture 6 : Python (0) | 2022.06.10 |
---|---|
컴퓨터과학 CS50 2020 Lecture 5 : Data Structures (0) | 2022.06.07 |
컴퓨터과학 CS50 2020 Lecture 3 : Algorithms (0) | 2022.06.05 |
컴퓨터과학 CS50 2020 Lecture 2 : Arrays (0) | 2022.05.27 |