본문 바로가기
자바 Java

변수의 본질은 메모리 / 메모리의 종류

by MEHAVING 2019. 10. 29.
반응형

변수의 본질은 메모리

모든 메모리는 자신의 위치를 식별하기 위한 근거로 고유번호를 갖는데, 이 번호를 메모리의 주소라 한다

 

 

변수를 이루는 세가지 요소

1) 이름이 부여된 메모리

2) 그 안에 담긴 정보

3) 메모리의 주소 ( 메모리에 저장된 주소에 관심있는 & 주소 연산자 )

#include <stdio.h>

int main(void)
{
    int nData = 10;
    printf("%s\n", "nData"); //nData 이름 출력

    printf("%d\n", nData); //nData 값 출력

    printf("%p\n", &nData); //nData 주소 출력
}

 

출력값

nData
10
0060FEFC

 

 

위 코드의 의미

"이름이 nData인 부호가 있는 64비트 정수형 메모리의 실제 주소는 0060FEFC이고, 그 안에 저장된 정보를 해석하면 10진 정수인 10이다."

 

&nData라는 연산의 의미

"이름이 nData인 메모리의 실제 주소는?"

&nData == 0060FEFC에서 네 바이트 메모리를 int형 변수로 본다.

직접지정한 주소를 확정하여 식별하는 방식

 

주소 연산과 정반대되는 개념의 연산자인 *간접지정 연산자 

변경될 수 있는 임의의 기준주소로 상대적인 위치(주소)를 식별하는 방식

 

임의 대상 일정 길이(크기)의 메모리에 저장된 정보를 해석하는 방법인 자료형을 지정한다

ex) 메모리의 주소가 0x0012FF60인 메모리를 int형으로 지정한다

: 총 네 바이트의 메모리 ( 주소가 0x0012FF60, 0x0012FF61, 0x0012FF62, 0x0012FF63 인 메모리 덩어리)를 한 세트로 보고 int형 변수로 취급한다

 

 

 

#include <stdio.h>

int main(void)
{
    int x = 10; //int형식 변수 선언 및 정의

    int *pnData = &x; //변수 x를 가리키는 int형식에 대한 포인터 변수 선언 및 정의
    //포인터 변수 pnData에 저장된 주소를 가진 메모리를 int형 변수로 취급

    printf("x : %d\n", x);

    *pnData = 20; // pnData 포인터 변수가 가리키는 대상 메모리를 int형 변수로 간접 지정하고 20을 대입
    printf("x : %d\n", x);

    return 0;
}

 

출력 값

x : 10

x : 20

 

pnData에 저장된 정보

이름이 x인 메모리의 주소

 

 

포인터와 배열

배열의 이름이 주소, 포인터 변수에 저장 가능

#include <stdio.h>

int main(void)
{
    int aList[5] = {0};

    int *pnData = aList; // 배열은 첫번째 배열 원소의 주소값이므로 포인터에 주소연산자 없이 선언 가능
    printf("aList[0] : %d\n", aList[0]); 

    *pnData = 20; // 포인터가 가리키는 배열의 첫번째 원소에 20 대입
    printf("aList[0] : %d\n", aList[0]); 

    return 0;
}

 

배열에 저장된 문자열의 길이를 측정하는 프로그램

#include <stdio.h>
#include <string.h> // strlen() 함수 사용하기 위한 헤더

int main(void)
{
    char aList[] = {"words"}; //문자 배열 선언 및 초기화

    char *pList = aList; //문자 배열을 가리키는 문자 포인터 벼수의 선언 및 정의
    int length = 0;

    while(*pList != NULL) //포인터가 가리키는 배열에 저장된 char형 데이터가 문자열의 끝을 의미하는 NULL가 될 때까지
    {
        pList++; //포인터 변수의 값에 저장된 주솟값을 계속 증가시키는 방법 
        length++; //배열의 처음부터 '\0'이 저장된 메모리가 나올 때까지 차례로 접근
    }

    printf("length : %d\n", length);
    printf("length : %d\n", strlen(aList));
    printf("length : %d\n", strlen("words"));

    return 0;
}

 

실행결과

5

5

5

 

 

*pList++이 아니라 pList++ 인 이유는 pList 값에 저장된 aList의 주솟값을 증가(char형 크기 만큼 한칸 이동)시켜야 aList배열이 가지고 있는 char형 단어의 개수를 알 수 있음. *pList++을 하면 포인터변수가 가리키는 aList배열이 가진 값을 증가시키는 것(w에 ++를 하는 꼴)이라 배열의 값을 바꿀 때 사용해야함. 이는 배열의 주소값과 전혀 연관성이 없기 때문에 아예 말이 안됨.

 

 

#include <stdio.h>
#include <string.h> // strlen() 함수 사용하기 위한 헤더

int main(void)
{
    char aList[16] = {"words"}; //문자 배열 선언 및 초기화

    char *pList = aList; //문자 배열을 가리키는 문자 포인터 벼수의 선언 및 정의

    while(*pList != NULL) //포인터가 가리키는 배열에 저장된 char형 데이터가 문자열의 끝을 의미하는 NULL가 될 때까지
    {
        pList++;
    }

    printf("length : %d\n", pList - aList); //null문자가 저장된 위치에서 시작위치를 빼면 문자열의 길이를 알 수 있다

    return 0;
}

 

실행결과

5

반응형

'자바 Java' 카테고리의 다른 글

문자와 문자열 관련 함수  (0) 2019.11.10
문자열 표준 함수 / 문자열 처리 함수  (0) 2019.10.30
상속 extends / 상위클래스 하위클래스  (0) 2019.10.16
추상클래스 추상메서드  (0) 2019.10.16
문자열  (0) 2019.10.09

댓글