본문 바로가기

Embedded Programming

포인터의 증감연산과 포인터의 자료형 #include int main() { int i = 0; char c = 'a'; int *ip = &i; char *cp = &c; printf("ip -> i cp -> c\n"); printf("ip : %p ip + 1 : %p\n", ip, ip+1); printf("cp : %p cp + 1 : %p\n\n", cp, cp+1); ip = &c; cp = &i; printf("ip -> c cp -> i\n"); printf("ip : %p ip + 1 : %p\n", ip, ip+1); printf("cp : %p cp + 1 : %p\n", cp, cp+1); return 0; } 위의 예제에서 보면 int 형 포인터 ip와 char형 포인터 cp는 같은 "포인터 변수" 이.. 더보기
volatile 변수의 쓰임 volatile 키워드는 한 마디로 얘기하면 컴파일러가 메모리 접근을 최소화 시키는 최적화를 하지 못하게 막는 예약어이다. 의미없는 반복문 같은 경우는 컴파일러에 따라서 캐쉬 메모리를 이용한다던가 레지스터 내에서 모든 연산을 마치고 값을 다시 메모리로 계산값을 메모리(즉, 변수)에 저장하는 최적화를 진행한다. volatile은 이러한 최적화를 금지하고 FM대로 메모리에 접근하고 레지스터로 이를 읽어와 연산 후 메모리로 다시 저장시키는 방식으로 처리하라는 선언이다.volatile 선언은 크게 두 가지 의미가 있다.첫째는 컴파일러가 코드를 최적화시키는 것을 방지하겠다는 것이다. int main() { volatile unsigned int iCount = 0; *((volatile unsigned int *.. 더보기
불 대수(BOOL) ※공리란 증명없이 참으로 인식하는 것을 말한다. (예 1 + 1 =2)교환법칙 : 연산자를 기준으로 좌우 피연산자의 위치를 교환. 식이 복잡해지면 헷갈릴수 있으므로 주의한다. 분배법칙 : 연산자가 두 개 이상이어야만 성립한다.(같은 연산자 두개는 해당안됨.) 더보기
Visual Studio 2010 환경변수 설정하기 1. 윈도우키 + break 또는 내 컴퓨터 우클릭 -> 설정2. 고급 탭 -> 환경변수 클릭 3. 아래 시스템 변수에 아래 항목들을 추가해준다. path는 원래 설정되어 있으므로 편집을 클릭하고 path를 추가해주고,include 와 lib는 아마 변수가 없을것이니 새로 만들기 해준다.(* path에 편집으로 다른 경로 뒤에 덧붙일 경우 세미콜론(;)으로 경로를 구분해 주어야 한다.) Path : C:\Program Files\Microsoft Visual Studio 10.0\VC\bin; // cl.exe가 있는 경로 C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE;// cl 을 실행하기 위해 필요한 DLL 파일이 있는 경로INCLUDE : C.. 더보기
배열을 함수에 전달하기 (배열을 인수로 전달하기) #include #define MAX 5 int largest(int arr[], int last); int main() { int array[MAX] = {1, 2, 3, 4, 5}; int biggest; biggest = largest(array, MAX); printf("최대값은 %d\n", biggest); return 0; } int largest(int arr[], int last) { int i; int biggest = -10000; for (i = 0; i biggest) biggest = arr[i]; } return biggest; } 배열을 함수에 전달하는 방법은 포인터 밖에 없다. 위 함수의 원형을 보면,int largest(int arr[], int last);로 배열 자체를 .. 더보기
포인터 연산 * 포인터와 관련된 연산의 종류 연산 예 설명 할당 int *p = &a; 포인터에 주소값을 할당하는 것으로, 주소연산자 또는 포인터 상수(배열 이름)으로부터 나온 주소가 되어야 한다. 간접 *p = 6; 간접연산자(*)은 포인터로 지정된 위치에 값을 조작가능 주소 int x; int *px; int **ppx; px = &x; ppx = &px; 포인터 변수명에 주소연산자(&)를 붙이면 포인터 변수 자체의 주소가 된다. 주로 다차원 배열에 이를 이용할 수 있다. 증가 int *p;p++;(4byte 증가) p += 4;(16byte 증가) 포인터의 자료형 크기만큼 가리키는 주소값을 증가시킬 수 있다. (int *: 4byte, short *: 2byte, char *: 1byte…) 감소 int *p;.. 더보기
배열과 포인터 * 배열이란? - 배열은 연관성 있는 자료를 한가지 자료형으로 연결시킨 것이라 할 수 있다. 위의 배열 변수 선언문은 int형 변수 10개를 array란 이름으로 묶은 것이다. 위의 array 배열은 메모리에 연속해서 아래 그림과 같이 공간을 할당받는다. int의 크기인 4 byte 크기로 연속하여 주소를 할당받는 것이다.그리고 크기가 10인 위의 array배열과 같은 경우에는 색인(index 또는 배열 번호)이 0부터 9까지 할당된다.각 색인으로 배열의 값에 직접 접근할 수 있다.예) array[0] = 10; // array의 0번 자료에 10을 대입함. * 배열의 초기화배열을 초기화 할때는 숫자 자료형 배열일 경우에는int array[10] = {10, 20, 30, 40, 50, 60, 70, 8.. 더보기
다수의 파일로 나누어 작업하기(header file 만들기) #include void AA(float); int main() { AA(3.14f); return 0; } void AA(float fNum) { printf("fNum : %f\n", fNum); } 위의 코드를 함수 별로 나누어 저장하면 main()함수와 AA()함수를 각각의 .c파일에 따로 저장하고이를 공통으로 include 해주는 헤더파일 .h를 만들어주면 된다.그리고 헤더파일에는 함수의 정의부분을 선언해주면 된다. 이렇게 나누어진 파일은 cl /c @@@.c 형태로 분할 컴파일 해준 후cl ***.obj ###.obj 형식으로 링크해주면 하나의 실행파일을 만들 수 있다. 위에서 cl /c 파일명.c 형태의 분할 컴파일은 아래 그림의 ①②③단계에 해당한다.전처리 과정에서 헤더를 포함시키고 그것을.. 더보기
프로세스의 메모리 영역 32비트 시스템에서 프로세스(실행 중인 프로그램) 생성시 4GB의 메모리를 할당받을 수 있는데,이는 램만으로는 충당하기엔 턱없이 부족하다.그래서 운영체제는 램과 하드디스크를 하나로 묶어 가상 메모리로 관리한다.대부분의 시스템에서는 주로 페이징(Paging)이라는 기법으로 가상 메모리를 관리한다.페이징 기법은 아직 모르므로-_-; 가상메모리의 영역에 대해서만 이야기해보자. 가상 메모리는 프로세스당 아래와 같은 구조를 가지는데,모두 5대영역으로 나뉜다. 아래 그림과 같이 데이터를 분류하여 각 영역에 저장하는 것이다. 위의 메모리 영역은 크게 두가지로 나눌 수 있는데 컴파일시 크기가 고정되는 code, data, bss 영역과 실행시 메모리가 할당되었다 반납되는 heap, stack영역으로 나눌 수 있다. ①.. 더보기
C언어 함수(function)의 기초 (함수의 구성, 정의, 호출) 함수(function)란? - 함수란 영어 function에서 온 말인데 이 뜻은 "기능"을 뜻한다. 즉, 기능을 구현하는 부분을 따로 떼어 구현하는 것으로, 구조화 프로그램의 중요한 개념이라 하겠다. 함수의 기본 형태 함수의 형태는 우선 우리에게 친숙한 main 함수를 예로 들어보겠다. 함수는 윗 그림과 같이 반환 자료형과 함수이름, 인수목록으로 나뉜다. 반환 자료형이란 메인함수의 사용에서 return 0; 부분을 보면 0을 반환한다는 말인데 정수형을 반환하므로 여기서 int로 쓰였다. 그리고 함수 이름은 main 함수의 경우 프로그램 실행시 가장 먼저 실행되는 부분이므로꼭 필요한 함수로 변경할 수 없지만 사용자 정의 함수의 경우에는 일반적인 명명규칙에 따라 사용자가 지정해줄 수 있다. 인수 목록은 m.. 더보기