Language/C

C언어 강좌 (포인터/변수의 값과 주소/포인터 기초)

Dexter_- 2016. 9. 7. 09:31
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
반응형