반응형
[CS50] 메모리 - 문자열 비교, 복사, 할당과 해제
CSE/CS502024. 6. 17. 16:00[CS50] 메모리 - 문자열 비교, 복사, 할당과 해제

문자열 비교#include int main(void){ char *s = "EMMA"; printf("%p\n", s);}이 코드를 실행하면 s라는 포인터의 값인 "EMMA" 문자열의 첫 문자 'E'에 해당하는 메모리 주소가 출력된다. 그렇다면 아래 코드들은 무엇을 출력할까?printf("%p\n", &s[0]);printf("%p\n", &s[1]);printf("%p\n", &s[2]);printf("%p\n", &s[3]);s가 가리키는 곳을 시작으로 "EMMA"라는 문자열로 이루어진 문자의 배열이 있으니 각각 s 문자열의 첫 번째, 두 번째, 세 번째, 네 번째 문자의 주소값을 출력하게 된다. 자세히 들여다보면 &s[0]는 'E'의 주소값을, &s[1]은 'M'의 주소값을, &s[2]는..

[CS50] 메모리 - 문자열
CSE/CS502024. 6. 17. 14:00[CS50] 메모리 - 문자열

CS50 강의에서는 문자열을 저장하기 위해 CS50 라이브러리에 포함된 string 자료형을 사용해왔다. 예를 들어 아래와 같이 변수 s에 "EMMA"라는 값을 저장한다고 가정해 보자.string s = "EMMA";문자열은 결국 문자의 배열이며 s[0], s[1], s[2]와 같이 각 문자가 배열의 한 부분을 나타낸다. 문자열의 끝을 표시하기 위해 가장 마지막에 \0이라는 0으로 이루어진 바이트가 추가된다. 여기서 변수 s는 이 문자열을 가리키는 포인터가 된다. 더 구체적으로는 문자열의 첫 번째 문자인 주소 0x123에 있는 s[0]를 가리키게 된다. CS50 라이브러리를 보면 string 자료형은 다음과 같이 정의되어 있다.typedef char *string여기서 typedef는 새로운 자료형을 정..

[CS50] 메모리 - 포인터
CSE/CS502024. 6. 14. 06:00[CS50] 메모리 - 포인터

포인터와 메모리 주소지난 강의에서 배웠던 * 연산자는 특정 메모리 주소에 있는 값을 받아오게 해준다. 이 연산자를 이용해 포인터 역할을 하는 변수를 선언할 수도 있다. 아래 코드는 포인터 변수를 사용하여 변수 n의 주소와 값을 출력한다.#include int main(void){ int n = 50; int *p = &n; printf("%p\n", p); printf("%i\n", *p);}정수형 변수 n에는 50이라는 값이 저장되어 있다. 그리고 *p라는 포인터 변수에 &n이라는 값, 즉 변수 n의 주소를 저장한다. int *p에서 p 앞의 *는 이 변수가 포인터임을 나타내고 int는 이 포인터가 int 타입의 변수를 가리킨다는 의미이다. 따라서 첫 번째 printf 문에서는 포인터 p..

[CS50] 메모리 - 메모리 주소
CSE/CS502024. 6. 14. 04:00[CS50] 메모리 - 메모리 주소

16진수컴퓨터과학에서는 숫자를 10진수나 2진수 대신 16진수(Hexadecimal)로 표현하는 경우가 많다. 16진수는 컴퓨터에서 데이터를 처리할 때 여러 가지 장점을 제공한다. 16진수와 10진수의 차이를 이해하면 16진수가 2진수를 간단하게 나타낼 수 있다는 것을 알 수 있다. 이제 16진수, 2진수, 10진수 간의 변환을 이해하고 프로그램을 작성해보자.  10진수를 16진수로 변환JPG 이미지 파일은 항상 10진수 255, 216, 255로 시작한다. 그러나 실제로 컴퓨터 내에서는 10진수를 사용하지 않는다. 컴퓨터는 0과 1만을 이해하기 때문이다. 예를 들어 255, 216, 255를 2진수로 나타내면 다음과 같다:255: 11111111216: 11011000255: 111111112진수로 모..

[CS50] 알고리즘 - 재귀
CSE/CS502024. 6. 14. 02:00[CS50] 알고리즘 - 재귀

재귀함수를 사용할 때 주로 main 함수 안에서 필요한 순간에 호출하여 사용한다. main 역시 함수라는 사실을 기억해야 한다. 함수는 본인 스스로를 호출할 수 있다. 이를 재귀$_{Recursion}$라고 부른다. 다음과 같은 피라미드 모양을 출력하기 위해 코드를 작성할 수 있다.##########기존 방법으로 중첩 루프를 사용하여 피라미드를 출력하는 코드는 아래과 같다.#include #include void draw(int h);int main(void){ // 사용자로부터 피라미드의 높이를 입력 받아 저장 int height = get_int("Height: "); // 피라미드 그리기 draw(height);}void draw(int h){ // 높이가 h인 피라미드 ..

[CS50] 알고리즘 - 버블 정렬
CSE/CS502024. 6. 14. 00:00[CS50] 알고리즘 - 버블 정렬

버블 정렬정렬되지 않은 리스트를 탐색하는 것보다 정렬한 뒤 탐색하는 것이 더 효율적이다. 정렬 알고리즘 중 하나는 버블 정렬이 있다. 버블 정렬은 두 개의 인접한 자료 값을 비교하면서 위치를 교환하는 방식으로 정렬한다. 단 두 개의 요소만 정렬해주는 좁은 범위의 정렬에 집중하는 접근법이다. 간단한 방법이지만 단 하나의 요소를 정렬하기 위해 교환을 너무 많이 시도해 낭비가 발생할 수 있다.  버블 정렬의 예시아래와 같은 8개의 숫자가 임의의 순서로 나열되어 있다. 이 숫자들을 오름차순으로 정렬하기 위해 바로 옆에 있는 숫자들과 비교하는 방법을 사용해보자.6 3 8 5 2 7 4 1먼저 가장 앞의 6과 3을 비교해서 순서를 바꾼다. 교환 전: 6 3 8 5 2 7 4 1교환 후: 3 6 8 5 2 7 4 1..

[CS50] 알고리즘 - 알고리즘 표기법
CSE/CS502024. 6. 13. 22:00[CS50] 알고리즘 - 알고리즘 표기법

알고리즘의 시간 복잡도와 Big O 표기법1주차에 알고리즘의 실행 시간을 시각적으로 표현한 예제를 보았다. 시각적 표현을 공식으로 나타낸 것이 Big O 표기법이다.  Big O 표기법Big O 표기법에서 O는 "on the order of"의 약자로 쉽게 말해 "시간이 ~만큼의 정도로 커지는" 것을 의미한다. 예를 들어 O(n)은 입력 크기 n만큼 커지는 것으로 n이 증가할수록 선형적으로 실행 시간이 증가함을 나타낸다. 비슷하게 O(n/2)도 결국 n이 매우 커지면 1/2은 큰 의미가 없어지므로 O(n)과 동일하게 취급된다. 주로 사용되는 Big O 표기법이다.$O(1)$: 상수 시간 복잡도$O(log \space n)$: 로그 시간 복잡도 (예: 이진 검색)$O(n)$: 선형 시간 복잡도 (예: 선형..

728x90
반응형
image