CS50_메모리_(1)[메모리 주소와 포인터, 문자열 ]

김두미·2022년 6월 23일
0
post-thumbnail

1. 메모리 주소

메모리에서는 16진수를 이용하여 주소를 나타낸다.

16진수는
0부터 15까지 한 글자로 표현할 수 있는데
10을 A로 11을 B로 ....15를 F로 표현한다.

16진수와 10진수가 헷갈릴수 있기에 16진수는 앞에 0x를 붙여 16진수임을 표현한다.

메모리와 관련된 c언어에서 사용할 수 있는 표현이 몇개 있다.

1) &

&는 ~의 주소를 나타내며 형식 지정자 %p를 이용해 출력할 수 있다.

int n = 50;
printf("%p\n",&n);

n이 저장된 메모리의 주소(16진수)를 출력한다.

2) *

&와 반대로 그 주소로 가게 하는 표현이다.

int n = 50;
printf("%i\n",*&n);

50을 출력한다.

&를 이용해 n이 저장된 메모리에 간후 그 *을 통해 그 주소로 간다.

2. 포인터

만약 어떤 변수에 주소를 저장하고 싶다면
저장하고자 하는 변수의 자료형과 함께 "*"를 써야합니다.

int n = 50;
int *p = &n;

printf("%p\n",p); // p에 저장된 n의 주소가 출력
printf("%i\n",*p); // p가 가리키고 있는 n의 값이 출력 -> 50

<int p = &n;> 에서
int는 이 포인터가 가리키는 값이 int임을 나타냅니다.
p에서 *는 포인터임을 알려줍니다.
주소는 포인터에 저장해야하며, 포인터는 추상화를 위해 사용됩니다.

3. 문자열

string s = "EMMA";는
char *s = "EMMA";와 동일하다.

char *는 주소에 있는 값의 자료형이 char라는 의미이다.
단지 s는 문자열의 첫 글자(E)의 주소를 가지고 있다.
MMA \0은 알지 못한다.

그렇다면 어떻게 string이 끝난것을 알수있을까?
\0을 마주칠 때까지 루프를 돌면서 끝을 알아내기 때문이다.

지금까지

#include <cs50.h>

를 이용해 string을 이용해왔다.

cs50.h에는 아래와 같은 코드가 적혀있다.

typedef char *string;

typedef를 통해 새로운 자료형이 선언됨을 알리고,
char *을 통해 이 값의 형태가 문자의 주소임을 알리고,
string이라는 이 자료형의 이름을 정의한다.

string 자료형은 char*과 동일하다. 일종의 추상화인셈이다.

string은 어떤 char의 주소를 가지고 있는 변수로 문자 하나를 가리키는 주소를 담고있다.

#include <cs50.h>
#include <stdio.h>

int main(void) 
{
	string s = "EMMA";
    printf("%s\n",s);
}

를 하면 EMMA가 잘 나온다.

여기서 cs50.h를 include 하는 코드를 지우면 작동하지 않는다.

대신

#include <stdio.h>

int main(void) 
{
	char *s = "EMMA";
    printf("%s\n",s);
}

string을 char *로 변경하면 동일하게 실행이 된다.

문자열은 여러 문자의 묶음을 추상화한 것으로 s는 그저 주소를 담고있을 뿐이다.

만약 EMMA가 아닌 주소를 보고 싶다면

printf("%p\n,s");
를 하면 된다.

printf("%p\n,&s[0]");
이렇게 첫번째 문자의 주소를 출력해도 앞선 printf와 동일하다.
왜냐하면 s에는 어차피 문자열의 첫 주소만 들어가기 때문이다.



profile
개발자를 꿈꾸는 대학생

0개의 댓글