Language/C C언어 강좌 (포인터/변수의 값과 주소/포인터 기초)
  • 728x90
    반응형

     

    C언어 Chapter 10. 포인터


     

    💡 컴파일은 Visual C++ 6.0 버전을 사용하였다.

     

     

    변수의 값과 주소

    심볼 테이블과 변수 x의 메모리 할당.

     

     

    • 심볼테이블에는 변수의 이름과 자료형, 그리고 이 변수가 할당받은 메모리의 주소가 기록된다.
    • 변수가 할당받은 메모리 공간에는 변수의 값이 들어간다.
    • 선언된 직후에는 변수가 무슨 값을 가지고 있는지 알 수 없기 때문에 미정값을(undefined valued)으로 부른다.

     

    x = 25;

     

    변수 x를 초기화 시킴으로 변수의 메모리주소 값은 아래와같다.

     

    변수 초기화 후의 메모리

     

     

     

    Visual C++ Debug 모드에서 메모리 주소값 알아보는 법

    💡 Debug 모드는 원하는 지점에 F9키로 break 포이트를 찍고 F5키로 진입한다.

     

     

    • Watch 에 엔퍼센트(&)를 붙여 변수이름을 입력하면 주소값이 출력된다.
    • 아래에는 초기화되지 않은 변수의 미정값을 출력.

     

    메모리 옵션 경로

     

     

     

    • Watch 의 주소값을 메모리 주소에 동일한값을 입력하면자세한 주소값을 보여준다.

     

     

    iNum에 16진수로 12345678 값을 초기화 했을 때

     

     

    위 그림은 iNum에 16진수로 12345678 값을 초기화 했을때

    iNum = 0x12345678;

     

    주소에는 1byte씩 묶어 숫자를 뒤집어서 저장한다. (intel cpu 는 계산을 빨리 하기위해 숫자를 뒤집어서 주소에 입력)

     

    즉 intel cpu는 little Endian 방식을 따르고있다.

    💡 계산은 숫자의 뒤에서 하면 빠르다는 것을 이용한다.

    💡 Tip ? "xV4."는 "78 56 34 12"의 아스키코드의 값이다.

     

    little Endian 방식에 대한설명은 앞장에서 설명되어 있습니다.

     

    C언어 기초 (실수형상수/형식지정자/Endian)

    C언어 Chapter 4. 실수형 상수 자료형바이트 크기범위유효숫자Float43.4*10(-38승)~3.4*10(38승)7자리Double81.7*10(-308승)~1.7*10(308승)15자리Long double8~103.4*10(-4932승)~1.1*1.1*10(4932승)19자리 Ex) 1234567891011121314// 실

    mystyle1057.tistory.com

     

    printf 로 주소값 출력 방법

     

     

    결과 : %p와 변수에 엔퍼센트(&) 를 이용해 출력가능

     

     

     

    🔔 예) 포인터 변수의 선언과 사용을 보여주는 프로그램

     

    • 변수 *xp는 포인트형 임을 뜻한다.
    • 포인터형은 주소를 저장하지만 "주소 = 양의 정수" 이므로 unsigned int 형으로 생각하면된다. (★★★★★)
    • 포인터형으로 변수를 선언할 때 *의 갯수의 제한은 없다.
    • 스택(stack)방식으로 인해 앞에 선언된 변수(0012FF7C)주소 보다 뒤에 선언된 변수(0012FF78)의 주소값이 더 낮다.

     

     

    💡 위 메모리주소는 Windows OS PC에 똑같은 값이 적용된다. 이는 가상메모리에 속하기 때문이다.

    💡 Tip ?
    출력문에서 * : 단항 →포인터
    출력문에서 * : 다항 →곱셈

     

    결과 : *xp = &x;(직접참조) x의 주소에 저장된x = 7; 에서 '7'값을 *xp(간접참조)로 출력한다.

     

     

    🔔 예) 변수 선언 없이 8을 12FF7C 라는 주소에 대입할 때

    *((int *)0x12FF7C) = 8;

     

    🔔 예) 변수 type에 따른 출력값의 용량

     

    • int *ip 변수 선언에서 int는 간접참조할 값을 int형 으로 받아 들인다. 즉, float, char 등 다른 형이 올 수 있다는것.

     

    결과 : float은 메모리 저장방식 자체가 다르므로 오류값.

     

     

    • 위 소스코를 컴파일하면 warning 메시지가 3개뜬다.
    • 그러나 error 메시지는 뜨지않는다.(c++에서는 오류로 간주)
    • warning 메시지를 해석하면 대입하는 변수값이 서로 type 이 틀리다는 내용

     

     

    🔔 예) warning 메시지 없애는 방법

     

    • 변수 초기화 값 을 캐스팅으로 포인터형으로 바꿔준다.
    • 캐스팅은 소스코드가 길어 지지만 속도나 형식에 영향을 주지 않는다.

     

    결과 : warning 메시지 해결

     

     

     

     

     

     

     

     

    728x90
    반응형
상단으로