-
CS50 2019 (12)메모리, 16진수, 진법 직관, 포인터, 문자열CS50 2023. 3. 11. 23:17
---
모두를 위한 컴퓨터 과학 (CS50 2019)
부스트코스 무료 강의
www.boostcourse.org
1.컴퓨팅사고
2.C언어
3.배열
4.알고리즘
5.메모리
6.자료구조
---
1)메모리 주소
우리가 C로 작성한 변수들은 실제로 컴퓨터 메모리에 어떻게 저장될까요?
메모리 주소를 나타내는 방법과
그 주소를 알아내는 방법,
그 주소에 찾아가는 방법을 배워봅시다.
---
학습 목표
- 16진법을 읽고 쓸 수 있습니다.
- 메모리 주소에 접근하고 값을 받아오는 코드를 C로 작성할 수 있습니다.
---
강의 시작~ 보조바퀴인 cs50라이브러리를 떼어내는 날, 알고리즘을 배웠었는데 좀 더 실용적이고 체계적인 부분
제일 먼저 배울 건 수를 세는 새로운 방식
10진법과 2진법 등 n진법을 배웠었음 :
이게 중요한 이유는 컴퓨터와 휴대폰에 있는 이미지와 같은 파일을 만들거나 수정할 때
컴퓨터나 휴대폰 속 메모리의 위치를 표현하는 데 매우 유용하기 때문.
각 바이트에 고유한 숫자를 부여하여 메모리 속 내용물에 대해 이야기할 수 있음
이렇게 적을 수도 있다는 말, 일반적으로 쓰이는 방법은 아니지만 문제 될 건 없다
이걸 좀 다르게 표현해보자
0~9까지 적고, 그 다음부터 알파벳 A~F를 이용해서 9보다 큰 숫자를 센다
10진법도 2진법도 아닌 16진법을 써서 한자리로 0부터 9까지 뿐만 아니라 10, 11, 12, 13, 14, 15까지 셀 수 있게 된다
= 16진법(hexadecimal), hex가 16을 의미, F는 15를 의미
이런 패턴이 앞으로 계속 나올 것
컴퓨터가 숫자를 10진수나 2진수가 아닌 16진수로 표현할 때가 많다. 왜 인지는 곧 보자
---
▽내가 적은 진법 직관 세우기
세상 모든 수를 2*n + 1로 표현 할 수 있잖아,
다른 진법도 세상 모든 수를 3*n, 3*n+1, 3*n+2 이런식으로 표현이 가능함
위의 줄의 2진법의 +0과 +1은 맨 2진법으로 표현된 수의 첫째 자리로 표현할 수 있고 (ex. 110 의 0)
둘째자리부턴 2가 몇개 있느냐임, 그게 전부야
2 1개, 10
2 2개, 100
2 3개, 110
2 4개, 1000... 이렇게 2의 n개를 전부 2진법으로 표현이 가능함
어떻게?
4개 에서 8개가 되는 1000 -> 10000으로 가기까지 5개, 6개, 7개가 되는 4+1, 4+2, 4+3이 그 아래 10, 100, 110으로 표현이 가능해. 그래서 1010, 1100, 1110이 되고, 이건 앞으로 계속 그렇다. 8개도 1~7을 그 아래로 표현할 수가 있고
... 4~7, 8~15, 16~31 ... 다 표현이 가능
3진법의 +0, +1, +2도 3진법의 표현된 수의 첫째자리로 표현할 수 있고 (ex. 211 의 1)
둘째자리부턴 3이 몇개 있느냐임
---
2진법은 0, 1이 있고
10진법은 0~9이 있고
16진수는 0~F이 있다.
이진수는 이렇게 표현했었어
이 사진은 bit가 8개 있고 각 bit는 한 이진수를 의미
각 자릿수를 위의 값과 곱하면 10진수로 표현됨
전부 1이면 8비트로 표현할 수 있는 가장 큰 숫자 255가 됨 0부터 세기 때문에 0을 하나의 수로 사용
---
▽아 0부터 세는 이유가
그냥 이진법 8개로 구분할 수 있는 경우는 총 256갠인것
00000000를 안쓸 수 없어 여기서부터 해야되니까, 그걸 0으로 생각하니까 0부터 세는거구나
굳이 이걸 1로 생각할 필요가 없지 이진법이라고 생각하면 되는데
---
2진법 11111111이랑
10진법
16진법
셋이 같은 수임, 16의 거듭제곱을 사용한다. 연산을 할 때 이렇게 표현하면 매우 편리하다고 합니다
맨 오른쪽 열은 16의 0승, 즉 1의 자리
두번째 열은 16의 자리 ▽16의 자리 라고 표현을 하는게 맞군, 10의 자리, 16의 자리 이렇게. 1의 자리는 공통된 용어??
10진법에서 10을 표현하려면 10로 적어야 하지만
16진법에선 일의자리에서 더 셀 수 있다
00
01
02
03
04
05
06
07
08
09
0A --일의 자리에서 조금 더 셀 수 있다
0B
0C
0D
0E
0F = 10진법 15
10 = 10진법의 16 --이제서야 2번째 자리수가 생김,
ten이라고 읽으면 10진법의 숫자고
16진법의 one zero라고 읽으래. 16진법의 일 영
이 순서가 되는 것
...
17 = 23
18
19
1A = 26
...
1F = 31
20 = 32
일반적으로 우리는 16진법으로 생각하지 않지만 앞으로 많이 볼 것
---
11111111, 2진법 : 저렇게 1이 4개 씩 있다면 16진법의 F로 표현할 수 있다
= FF, 16진법
1+2+4+8 = 15 니까
16 * (1+2+4+8) = F0이겠군
FF나 00와 같은 숫자를 본 적이 있을거야.
첫주에 배운 RGB를 떠올려보면 컴퓨터는 빨초파로 색을 표현하는데 각 픽셀을 일정량의 빨초파로 나타냄
사실은 사람이 쉽게 표현하기 위해 16진법으로 각 색의 양을 나타내도록 정한 것
no red, no green, no blue = 00 00 00 이면 검정색이었음
FF 00 00 이면 255만큼의 빨간색이 있는 것
FF FF FF 는 흰색
이 표기는 굉장히 흔해~!
---
다시 메모리의 생김새를 보면
격자로 구성된 바이트들임
0...1F...
계속 늘려나갈 수 있다
처음 보면 헷갈릴 수 있다 10진수 인지 16진수인지 어떤 진수 인지
그래서 헷갈리지 않기 위해 16진수를 사용할 때는 모든 수 앞에 0x를 붙이기로 약속함
0x는 수학적으로는 아무런 의미가 없지만 앞으로 나오는 값이 16진수라고 알려줌
8진법도 있지만 여기선 안 다룬다
---
자 이제 이 정보를 어떻게 사용할까?
컴퓨터의 메모리속에서 실제로 어떤 일이 벌어지는지 살펴보기
그래서 왜 메모리를 다룰때 16진법이 적절한지
그리고 메모리 세게에서 어떻게 메모리를 다루는지
메모리의 주소를 다뤄보자!
간단하게 프로그램 address.c라는 파일 만들고(컴퓨터 메모리 주소를 다룰거라는 파일명)
make address로 컴파일
./address로 실행
그럼 50이 나옴
여기서 컴퓨터의 메모리 속에서 어떤 일이 벌어지는지 추론하기
저 격자가 내 컴퓨터의 메모리라고 하면
내가 저장한 변수 n이 저깄고, int니까 4바이트. 네개의 메모 차지
더 깊게 내려가 보면, 사실 50이 아니라 32bits로 구성된 0과 1이 50을 표현하고 있을 것
하지만 트랜지스터같은 로우레벨의 내용은 안다룰것임
printf는 변수 n안에 있는 내용을 출력하는 것
엄밀히 말해 저 변수는 메모리 어딘가에 있다
컴퓨터에 수십억 바이트가 있다고 할 때
변수 n 과 그 안에 있는 값 50은
0x12345678이라는 위치에 있다고 가정해 봅시다
메모리가 그 이상의 바이트를 가지는 한 메모리 어딘가에 존재한다는 말
C언어를 사용하면 이 위치 또한 확인할 수 있다
코드를 좀 바꿔서 n이 아니라 &n을 출력할 것, C의 문법 중 하나로 "~의 주소"를 의미하는 연산자(메모리 속 위치)
+ 이를 위한 형식 지정자 %i대신 %p, 얘를 쓰면 주소를 출력해줌.
make address다시 하고
CS50 IDE가 동작 중인 클라우드 서버(▽컴퓨터임)에서 정확하게 어디에 위치하는지 알려줌
---
컴퓨터 메모리 속 어디에 값이 저장되어 있는지 확인할 수 있다!
그 값은 우리가 컴퓨터에 특정 값의 주소를 요구한 것으로
여러분은 그 값을 가리키는 포인터 값을 돌려 받음
포인터는 컴퓨터 메모리의 주소를 가리키는 것 그래서 %p라고 씀
printf에게 포인터 변수(무언가의 주소)를 출력해달라고 하는것. 항상 16진수로 출력
근데 여기서 하나만 해서 원래대로 50을 출력하도록 돌릴 수 있다
사실 C언어에는 반대 역할을 하는 연산자도 있다
그 반대 역할하는 연산자가 * //스타 오어 애스터리스크 라고 발음함
곱셈에서 봤지만 다른 문맥에서는 의미가 달라짐
& : "~의 주소"를 줘
-- "주소가 뭐야?"
* : 곱셈말고 다른 문맥에서 "~의 주소"와 반대의 동작을 함
-- "그 주소로 가줘" 라는 의미
*& : 그 주소가 뭐야 + 그 주소로 가줘 라는 말, 이땐 %i를 쓰지
//어리석은 짓이지만 설명을 위해 &앞에 *를 붙여봄. 즉각적으로 연산을 되돌리는 것 *&n
학생질문)
0x12345678라는 주소를 기억해서 이 주소를 프로그램에 직접 쓸 수 있다! 마법부리는게 아니니까 가능.
형변환을 해야함.
학생질문)
변수의 자료형을 모른다면 어떤 형식 지정자를 사용해야 할까요?
: 직접 결정해야함. 컴퓨터에게 메모리는 0과 1이다. 그것을 어떻게 표현할지는 여러분에게 달려있음(오..!사실 전부 0과 1)
그게 뭔지 모른다면 추정하거나, 컴퓨터에게 무엇이든 알려줘야 합니다 char, float, int등.. C에서 자료형을 알려주는 기능은 없다
네이버 :
16진수
컴퓨터과학에서는 숫자를 10진수나 2진수 대신 16진수(Hexadecimal)로 표현하는 경우가 많습니다. 컴퓨터에서 데이터를 처리하기 위해 16진수를 사용할 때 장점이 있기 때문입니다. 16진수와 일상생활에서 우리가 사용하는 10진수와 비교하면 그 차이를 알 수 있습니다. 16진수를 사용하면 10진수보다 2진수를 간단하게 나타낼 수 있습니다. 16진수로 값을 표현하는 방법을 이해하고 나면 16진수, 2진수, 10진수를 변환하는 프로그램을 만들어볼 수 있습니다.
10진수를 16진수로 바꾸어보기
JPG 이미지 파일은 항상 255 216 255 로 시작되고 이것은 10진수입니다. 하지만 실제 컴퓨터 내에서는 10진수를 사용하지 않습니다. 컴퓨터는 0과 1만을 이해할 수 있기 때문입니다.
그림 1
먼저 255 216 255를 2진수로 나타내보면 <그림 1>과 같습니다. 2진수로 모든 데이터를 표현하기에는 너무 길어지기 때문에 16진수로 바꾸어 보겠습니다. 2^424
이 16이기 때문에 4bits씩 두 덩어리로 나누어 보면 0000 부터 1111까지는 16진수로 표현할 수 있다는 것을 알 수 있습니다.그렇다면 16진수에서 10부터 15까지는 어떻게 표기할까요? 10은 a, 11은 b, …, 15는 f를 대입하여 사용합니다. 4bits씩 16진수로 변환 후 0x를 붙혀 뒤에 오는 문자들이 16진수임을 알려줍니다.
16진수의 유용성
ASCII 코드에 의해 “A, B, C”는 10진수로 65, 66, 67에 해당합니다. 컴퓨터는 10진수를 이해할 수 없으므로 2진수로 표현해보면 "01000001 01000010 01000011"이 됩니다. 컴퓨터가 처리할 수 있어야 하기 때문에 어쩔 수 없지만 그 길이가 너무 긴 것을 알 수 있습니다.
하지만 16진수로 표현하면 2진수로 표현했을 때 보다 훨씬 간단해집니다. 또한 컴퓨터는 8개의 비트가 모인 바이트 단위로 정보를 표현합니다. 2개의 16진수는 1byte의 2진수로 변환되기 때문에 정보를 표현하기 매우 유용합니다.
메모리 주소
정수형 변수 n에 50이라는 값을 저장하고 출력한다고 생각해 봅시다.
이 n 이라는 값은 int 타입이므로, 아래 그림과 같이 우리 컴퓨터의 메모리 어딘가에 4바이트 만큼의 자리를 차지하며 저장되어 있을 것입니다.
C에서는 변수의 메모리상 주소를 받기 위해 ‘&’이라는 연산자를 사용할 수 있습니다.
#include <stdio.h> int main(void) { int n = 50; printf("%p\n", &n); }
예를 들어, 위와 같은 코드를 실행하면 ‘0x7ffe00b3adbc’와 같은 값을 얻을 수 있고, 이는 변수 n의 16진법으로 표현된 메모리의 주소입니다.
반대로 ‘*’를 사용하면 그 메모리 주소에 있는 실제 값을 얻을 수 있습니다.
#include <stdio.h> int main(void) { int n = 50; printf("%i\n", *&n); }
위 코드는 먼저 n의 주소를 얻고, 또 다시 그 주소에 해당하는 값을 얻어와 출력한 것이므로 결국 ‘50’이라는 값이 출력되겠죠.
---
2)포인터
앞서 배운 메모리 주소를 직접 관리하기는 쉽지 않을 수 있습니다.
C에는 포인터 라는 개념을 통해서 변수의 주소를 쉽게 저장하고 접근할 수 있게 해줍니다.
학습목표
- 포인터 변수를 정의하고 사용할 수 있습니다.
---
정보를 어디에 저장할 수 있는지 정확하게 알아보기
코드를 바꿔보면 주소나 변수를 저장할 수 있다
(저~~밑에 메모리 그림 설명이 있어 바로 이해되는)
&n은 주소를 가져온거고
변수를 좀 다르게 해줘야 하는게, 어떤 주소를 저장하고 싶다면, 그 변수의 자료형 뿐만 아니라 * 연산자 또한 써줘야함
다른 문맥에서 이건 포인터가 된다
: 자료형 써주고! * 써주고! 딱 두개! 명확!
int *
포인터는 *로 표시하고,
여기의 int는 이 포인터가 가리키는 값이 int라는 말.
▽포인터 변수가 차지하는 메모리공간이 있고 그 안에 써져 있는 주소는 다른 곳을 가리키니까 그거 int라고
p는
(1)변수이고
(2)int를 가리키는 포인터
(3)다시 말해 int의 주소
p를 출력하면 0x...이 나와
근데 이걸 또 출력하면 달라, 왜? 최근 컴퓨터는 보안상 문제로 메모리를 여기저기로 바꿔서 그렇다
p의 값이 아니라 p가 가리키고 있는 주소에 있는 값 출력(오늘 이후로 변수들이 어디에 위치하는지 신경 안 쓸거야)
어떻게 바꿀까?
%i, 와 *p를 해주면 됨. 50 나옴
*는 가리키는 주소 p로 가라는 의미
질문타임)
p는 어떤 정수의 주소인데, 어떤 정수? n임.
▽그 주소가 뭐야 vs 그 주소로 가(서 뭐가있는지 봐)
int p = &n 를 적으면 주소를 저장하려는데 clang이 경고함. 주소가 사실 숫자이긴 하지만 clang컴파일러가 똑똑해서 주소는 반드시 포인터에 저장해야해야 한다. int형에 저장할 수 없다
https://blog.naver.com/tipsware/221498204578
: int에 10진수만 저장할수 있나?해서 보니까 앞에 0x, 0 이렇게 표시를 하네
---
int n = 50;
저게 임의의 위치지만, 0x12345678에 있다고 가정하기
int *p = &n;
p또한 변수다 bit로 데이터를 저장해. 갖고 있는 값이 변수 n의 주소 이게 다야!
▽*p가 아니고 p야!
▽
저 50 네칸 차지하고 있는게 int n = 50;
인데 int *p = &n; 를 하면 저 8칸이 생긴다. 변수 선언을 해야 생기는 것이겠네
---
사실 포인터는 추상화를 위해 사용해
나머지 메모리는 없고 오직 두 값만 있다고 하면
큰 네모는 변수 p, 주소를 저장
다른 네모는 변수 n, 숫자 50 저장
난 n의 주소가 안궁금해, 접근만 하면 돼
따라서 컴퓨터 과학자는 주소 자체를 일일이 적지 않고 화살표를 그려서 p가 50을 가리킨다는 개념을 표현함, 이제 실제 주소는 신경쓸 필요가 없다.
▽int n = 5; 라고 했을 때도 내부적으로 포인터가 쓰인다는 얘긴가? 값이 저장된 곳의 주소는 알아야 하는데, 내가 주소를 변수로 추상화한거잖아, 그럼 그 사이에 주소와 변수를 이어주는게 있어야 되는게 맞는 것 같은데?? int n = 5;라고만 해도 n엔 사실 주소가 있는거 아냐??
포인터 변수 안에는 화살표가 있는거나 다름이 없다
앞으로 이 기능이 얼마나 강력한 지 볼 수 있다. 가리키고 가리키면 정교한 자료구조를 만들 수 있다 배열 등.
구글 페북 ms에서 수많은 데이터를 관리하기 위해 사용하는 알고리듬의 기초가 됨.(자료구조시간에 이런걸 다룰 것)
질문사항)
포인터의 크기가 꼭 두배여야 할까요? - 그림 보고 질문한 것인듯
: 꼭 그렇지는 않지만 대부분 그렇게 동작함
최신 컴퓨터는 64bits(8바이트)포인터를 사용. 둘째 주에 배웠던 long타입과 같음
그래서 그림을 저렇게 그림
현대 하드웨어가 대부분 그럴 뿐 꼭 그럴 필요는 없다
---
네이버 :
지난 강의에서 배웠던 ‘*’ 연산자는 어떤 메모리 주소에 있는 값을 받아오게 해줍니다.
이 연산자를 이용해서 포인터 역할을 하는 변수를 선언할 수도 있습니다.
#include <stdio.h> 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의 값, 즉 변수 n의 주소를 출력하거나, 두 번째 printft문과 같이 포인터 p가 가리키는 변수의 값, 즉 변수 n의 값을 출력할 수도 있습니다.
실제 컴퓨터 메모리에서 변수 p는 아래와 같이 저장될 수 있습니다.
하지만 아래 그림과 같이 실제로 p의 값, 즉 n의 주소값을 생각하지 않고, 추상적으로 단지 p가 n을 가리키고 있다는 것만 생각해도 됩니다.
이런 포인터를 기반으로 해서 앞으로 배울 다양한 데이터 구조를 정의하고 사용할 수 있습니다.
---
3)문자열
이전에 문자열에 대해 말한 내용은 선의의 거짓말. 오늘 떼려고 한 보조바퀴가 이것이다
이제 새로운 문맥에서 문자열을 살펴보자
string s = "EMMA";
이것은
컴퓨터안에서는 이렇게 보인다. 메모리속 어딘가에 5바이트의 공간에 E M M A + 종단문자(문자열의 끝을 구별, 8개의 0비트로 구성됨) 가 있다.
지금까지는 문자열을 조작하려면 s를 쓰고 [0] [1] [2] [3]을 사용해서 개별 문자에 접근했음.
아까 했듯이, 각 바이트는 고유의 주소를 갖고 있음.
이번 주 이후부터는 주소를 신겨읐지 않을테지만 분명 존재해.
문자열은 문자 하나하나가 계속 이어지는 형태여서 한 바이트씩 떨어져있다 ex. 0x123, 0x124..
메모리 0x123부터 존재한다고 하면
이때, 변수 s는 사실 그냥 포인터다. 그림봐봐 맞지? s라는 하나의 변수, 0x123이라는 값을 저장하고 있음
= EMMA가 시작되는 주소 0x123.
주소 알 필요는 없으니까 지우고 화살표를 그렸어
s는 엄밀히 첫번째 문자가 있는 0x123라는 주소만 알아.
문자열로 불리던 s는 M M A나 널 종단 문자에 대해 전혀 모름
첫글자의 주소만 기억하는데 어떻게 컴퓨터는 EMMA의 이름이 어디서 끝나는지 아는거야?
널 종단 문자로 안다. 컴퓨터는 똑똑해서 문자열의 첫번째 글자만 가리키면 널종단 문자를 마주칠때까지 루프를 돌면서 끝을 알아냄
---
이제 문자열 같은 건 없다.
문자열을 조작해보며 흥미를 주려고 했다. "hello world"한번 출력하고 싶은데 주소나 포인터에 대해 전부 이해하고 싶지 않을 거니까
그렇다면 문자열은 어떻게 구현돼 있을까?
지금까지 문자열은 문자의 배열이었는데, 이제 엄밀히 문자열은 포인터다. = EMMA의 이름이 저장된 변수 s는 포인터라고
int n = 50;
int *p = &n; //p라는 변수를 만들고, n의 주소를 저장
int *자체가 자료형. 정수의 주소를 저장한다.
이 코드는 이제
이렇게 적을 수 있다
char * : *는 주소, char는 주소에 있는 값의 자료형이 char라는 것 //문자를 가리키는 주소를 저장할 수 있다.
문자열은 문자들의 나열이고
결국 문자열은 문자 배열의 첫 번째 바이트 주소가 됨
그리고 마지막 바이트에는 0을 저장해 끝을 알려줍니다
---
cs50라이브러리엔 C에는 없는 문자열이라는 자료형을 만듦
잠시 지난주에 배웠던 typedef좀
typedef라는 키워드를 사용해서 이름이나 숫자와 같은 다양한 변수를 하나로 묶어서 person이라는 새로운 자료형을 선언할 수 있었다
typedef는 더 간단한 문법이 있다
라고 적으면
typedef : 새로운 자료형을 선언한다
char * : 이 값의 형태가 문자의 주소
string : 자료형의 이름
정확히 똑같은 이 한 줄이 여러분들이 몇주동안 불러오던 cs50.h헤더 파일에 적혀있다.
string은 char *와 동일해
일종의 추상화
문자의 나열을 결국 주소 하나로 나타낼 수 있다는 사실을 단순화 시킨 것
질문타임)
char *는 문자 하나를 가르키는 주소다. = string이었어
+
그리고 사람들은 문자열의 끝을 8개의 0비트로 채워진 널종단문자로 표현하기로 약속
문자열을 쓰고 싶다면 어디서 시작하고, 어디서 끝나는지 기억하면 된다!
* 로 이런 개념을 코드로 표현할 수 있다.
---
지난번엔
이 코드로 했어. 수많은 에러 중에 맨 첫번째부터 보시네요
어쨌든 #include <cs50.h> 넣어주면 make address로 컴파일 잘 되고 프로그램 실행하면 EMMA가 잘 나옴
이제 string을 안쓰고 출력해보자 #include 없애
엄밀히 말해 첫번째 문자의 주소를 갖고 있으면 됨
즉 char *s 이렇게 적으면 끝 양쪽에 공백 있어도 됨 char * s 이렇게, 근데 대부분의 프로그래머는 char *s
그냥 끝이야
char * s
char *s
상관없는데 대부분의 프로그래머는 char *이렇게 해
같은 s를 %p로만 바꾸면 주소가 나옴 ▽형식 지정자 s가 C에 있네!!
▽주소를 %s로 출력하면 주소 가서 값을 출력하는군 //int *는 %i하고 *p 두개 해줘야 했었다
이제 코드 한줄을 추가해, EMMA 이름의 첫 글자 주소
C에서 첫 글자만 표현하는 방법은?(전에 배울 때)
s braket zero, s[0], 이건 char고
이것의 주소는 &s[0]
;은 붙여줘야겠죠
같은 값이 출력됨, c에서 s의 주소는 첫번째 문자의 주소인데 확인해보기 위해 해본 것. 역시나 같다
그 뒤에 애들이 1바이트씩 차이나는것도 확인함
문자열은 여러 문자의 묶음을 추상화한 것
즉 s는 그냥 주소야!!
'CS50' 카테고리의 다른 글
CS50 2019 (14)메모리3, swap, call by value(reference), 힙스택, buffer overflow, 변수초기화, csv, argc, argv (1) 2023.03.13 CS50 2019 (13)메모리2, 주소+1, malloc(), segfault (3) 2023.03.12 CS50 2019 (11)merge sort (0) 2022.07.16 CS50 2019 (10)recursion, 쌓이는 것 (0) 2022.07.16 CS50 2019 (9)bubble sort, selection sort (0) 2022.07.16