'2015/02/04'에 해당되는 글 2건

  1. 2015.02.04 LEGO - Mindstorm
  2. 2015.02.04 포인터 변수의 기초
Busan IT/제어기초2015. 2. 4. 17:35

LEGO - Mindstorm

 

펌웨어를 짤 때 프로그램의 구조를 이해하는데 도움이 되기에 Mindstorm으로 실습한다.

 

1. Sound를 활용한 간단한 멜로디 만들기

 

2. Ultrasonic 센서를 활용하여 거리 차에 따라 다른 소리/문자 출력하기

 

3. 거리 측정기 만들기

반응형

'Busan IT > 제어기초' 카테고리의 다른 글

LEGO - Mindstorm #3  (0) 2015.02.06
LEGO - Mindstorm #2  (0) 2015.02.05
ADC와 Lego Mindstorm  (0) 2015.02.03
마이크로 컴퓨터와 ADC & DAC  (0) 2015.02.02
마이크로 컨트롤러와 프로그램  (0) 2015.01.30
Posted by newind2000
Busan IT/제어언어2015. 2. 4. 17:35


20150204 - 포인터 변수의 기초.hwp

포인터 변수의 기초

 

학습목표 - 포인터의 개념을 이해하고 심볼 테이블을 만들 수 있다.

 

#1. Pointer - Randomized Base Address

 

보안이 강화되어 DOS에서 주소 값 출력을 요구하면 해당 주소의 값은 지속적으로 바뀌는 현상을 보였다.

 

지난 시간에 Visual Studio에서 Randomized Base Address의 설정을 해지하면 Memory에서 address가 고정되어 나타남을 확인할 수 있다.

 

실습) Visual Studio에서 Randomized Base Address의 설정을 해지한 후 주소 값을 확인해 본다.

 






 


#2. Address값의 직접입력 실습

 

#include <stdio.h>

 

int main()

 

{

int iNum = 100;

 

printf("iNum의값:%d\n", iNum);

printf("iNum의주소:%08X\n", &iNum);

printf("iNum의주소:%p\n", &iNum);

 

return 0;

}

 

위에 과정에 대한 CPUMemory의 처리과정을 설명하면,

1. CPU에서 변수형 int 변수명 iNum 100 선언

2. 메모리에서 해당 변수형, 변수명, 변수값을 메모리에 등록

//단 변수명은 문자임으로 해당 변수가 저장된 메모리의 위치를 숫자로 표현

3. CPU에서 해당 변수의 값과 주소를 불러달라고 요청하면 컴파일러가 이를 해석하여 저장되어 있던 iNum의 주소와 값을 불러온다.

 

인간이 기계가 쓰는 2진수 체계의 언어를 이해하고 구사하기 힘들기 때문에 그 중간역할을 하는 중간언어를 만들어 인간이 기계에게 특수한 과제를 실행하도록 프로그램을 짤 수 있게 만들어 놓았다

//중간언어를 기계어로 번역하기 위해 중간프로그램이 필요하다.

 

변수 iNum는 인간의 인식을 위한 문자이고 실제로 변수는 숫자형태의 주소로 메모리에 저장된다.

 

주소 0012FF28(16진수)10진수 1,244,968이다. 이것을 표현하면 0012FF28=1,244,968인데 이것은 오류를 일으킨다. ‘=’의 명령어는 오른쪽에 있는 것을 왼쪽에 넣는 명령어인데 왼쪽에 위치한 값은 항상 변수이어야 한다.

//오른쪽에는 변수든 상수든 올 수 있다.

 

실습) 변수명 대신에 주소, 1244968을 넣고 변수 값 50을 넣어보자.

 

//연산을 위해 몇 개의 항이 필요한지에 따라 단항 연산자, 다항 연산자로 구분된다.

//사칙연산은 다항 연산자이고, 단순 부호(+/-)는 단항 연산자이다.

//C에서 숫자 앞이나 변수 앞에 ‘*’를 붙이면 주소로 취급된다.

//형식은 (‘변수형’ *)(‘주소’) = ‘변수 값으로 된다.

 

#include <stdio.h>

 

int main()

 

{

int iNum = 100;

 

 

printf("iNum의값:%d\n", iNum);

printf("iNum의주소:%08X\n", &iNum);

printf("iNum의주소:%p\n", &iNum);

 

(int *)(1244968) = 50;

printf("iNum의값:%d\n", iNum);

//(int *)

return 0;

}

 

 

 

#3.

 

포인터의 사용 방법을 지난 시간에 배웠다.

 

실습) 포인터를 사용하여 iNum의 값을 불러와 보자.

 

#include <stdio.h>

 

int main()

 

{

int iNum=100;

 

 

printf("iNum의값:%d\n", iNum);

printf("iNum의주소:%08X\n", &iNum);

printf("iNum의주소:%p\n", &iNum);

 

 

//iNum = 50;

*((int *)(1244968)) = 50;

printf("iNum의값:%d\n", iNum);

 

return 0;

}

 

* 는 주소의 값을 선언하는 변수



실습) int iNum의 값을 99로 설정하고 값과 주소를 출력해 본다.




 

 

 

포인터 변수(Pointer type)

 

메모리의 공간주소를 가리키는 변수를 말한다. 포인터 변수는 주소를 담는 변수이다.

 

자료형마다 포인트 타입이 다 따로 있다.

//왜 자료형마다 포인터의 타입이 따로 있을까? 변수형이 부여하는 byte수의 차이 때문일까?

 

int *int형의 포인터 변수이다.

#4.

 

실습) 인트 변수 iNum=99와 포인터 변수 iP를 설정하고 이것의 주소와 크기를 출력한다.

iP변수를 iNum의 주소로 설정한 후 iNum을 출력해본다.

 



 


<Symbol Table + value>

Style

Name

Address

Value

int

iNum

12FF28

99

int *

iP

12FF1C

12FF28

 

+@

iP주소(=iNum의 주소)77을 넣으면 실제로 77이 표시된다.

*iP = 77;

printf("iNum의값은[%d] 입니다.\n", iNum);

 

결과 값, iNum = 77

반응형
Posted by newind2000