본문 바로가기

Embedded Programming/C/C++

연산자 우선순위와 결합방향 연산자 우선순위란, 같은 항에서 연산자가 겹쳤을 때 어느 연산자가 가장 우선권을 갖고 먼저 처리하느냐를 정해놓은 것이다.이러한 우선순위를 굳이 달달 외울 필요는 없지만, 우선순위가 적용되어 처리되는 경우가 간간이 있으므로연산자간 우선순위가 있다는 정도만이라도 알아두면 좋을 것 같다. 순위 연산기호 연산자 결합방향 1 () 함수호출 → [] 배열 인덱스 -> 간접지정(구조체 멤버) . 직접지정(구조체 멤버) ++, -- (변수 뒤에서 증가/감소) 후위증가/감소 2 ++, -- (변수 앞에서 증가/감소) 전위증가/감소 ← sizeof 바이트 단위 크기 계산 ~ 비트단위 NOT연산 (비트 반전) ! 논리 NOT -, + 부호 연산(음수, 양수 표현) & 주소 연산 * 간접지정 연산 (포인터) 3 (자료형) 자.. 더보기
포인터의 증감연산과 포인터의 자료형 #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 *.. 더보기
배열을 함수에 전달하기 (배열을 인수로 전달하기) #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 형태의 분할 컴파일은 아래 그림의 ①②③단계에 해당한다.전처리 과정에서 헤더를 포함시키고 그것을.. 더보기
C언어 함수(function)의 기초 (함수의 구성, 정의, 호출) 함수(function)란? - 함수란 영어 function에서 온 말인데 이 뜻은 "기능"을 뜻한다. 즉, 기능을 구현하는 부분을 따로 떼어 구현하는 것으로, 구조화 프로그램의 중요한 개념이라 하겠다. 함수의 기본 형태 함수의 형태는 우선 우리에게 친숙한 main 함수를 예로 들어보겠다. 함수는 윗 그림과 같이 반환 자료형과 함수이름, 인수목록으로 나뉜다. 반환 자료형이란 메인함수의 사용에서 return 0; 부분을 보면 0을 반환한다는 말인데 정수형을 반환하므로 여기서 int로 쓰였다. 그리고 함수 이름은 main 함수의 경우 프로그램 실행시 가장 먼저 실행되는 부분이므로꼭 필요한 함수로 변경할 수 없지만 사용자 정의 함수의 경우에는 일반적인 명명규칙에 따라 사용자가 지정해줄 수 있다. 인수 목록은 m.. 더보기
4 byte float format (float 형의 실수 저장 방식) 일반 정수형 자료형은 보수법을 이용해 음수와 양수를 저장하지만, 실수형 자료형인 float 는 부동 소수점 방식과 부호 비트 방식을 사용하여 데이터를 저장합니다. float 자료형은 4 bytes의 크기 안에서 비트 별로 쪼개서 데이터를 저장하는데첫번째 1bit 는 부호를, 그 다음 비트부터 8bit 만큼은 지수를, 나머지 23 bit는 가수를 저장합니다.예를 들어, 100.34라는 실수가 있을 때 1.0034x10₂의 형태로 표현하는 것인데,소수점의 위치를 지정해주는 지수(10₂)와 1.0034라는 가수부분으로 나눌 수 있다. float형은 이 부동 소수점 방식에 최초 1bit를 부호비트로 할당하는 것이다. 이를 직접 확인해보는 C 프로그램을 작성해보자. float형 변수 fNum에 담긴 값을 char.. 더보기
포인터(pointer) 변수의 개념 * 포인터 변수란?포인터(pointer)는 프로그래밍 언어에서 다른 변수, 혹은 그 변수의 메모리 공간주소를 가리키는 변수를 말한다. 포인터가 가리키는 값을 가져오는 것을 역참조(逆參照, dereferencing)라고 한다.포인터는 어셈블리어, C, C++, 파스칼 등 하위 레벨까지 제어할 수 있는 언어에서 주로 많이 쓰이며, 모듈라-2, 에이다와 같은 언어에서는 극히 제한적으로 사용되고, 자바, 에펠등에서는 완전히 숨겨져 사용할 수 없다.첫 번째 부류의 언어에서는 포인터를 메모리의 임의의 주소를 가리키도록 할 수 있으며 포인터의 연산도 가능하다.C#의 경우 제한적으로 포인터가 사용 가능하다.일반적으로 포인터는 메모리 주소로 바꿀 수 있다. 포인터는 다른 변수나 함수를 가리키도록 사용된다.-위키백과 포인.. 더보기