ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CS50 2019 (12)메모리, 16진수, 진법 직관, 포인터, 문자열
    CS50 2023. 3. 11. 23:17

    ---

    www.boostcourse.org/cs112

     

    모두를 위한 컴퓨터 과학 (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는 그냥 주소야!!

Designed by Tistory.