본문 바로가기
반응형

컴퓨터/C63

[C] 특정 번지의 데이터 읽기 쓰기 특정 번지의 데이터를 읽고 쓰기 위해서는 포인터를 사용해야 한다. 0x1000 번지의 데이터를 읽고 쓰기 위한 코드는 다음과 같다. volatile char* pData = (char*)0x1000; *pData = 10; // *pData에 데이터를 읽고 쓴다. volatile 선언문 2020. 11. 12.
C의 ABS 매크로 함수 절대값을 구하는 ABS 매크로 함수는 다음과 같이 정의하여 사용한다. #define ABS(x) ((x 2020. 11. 1.
구조체 비트 필드 C의 구조체에서 비트 단위로 엑세스할 수 있다.struct Data{short Buffer1 : 3;short Buffer2 : 2;short Buffer3 : 4;}; 위와 같은 구조체의 데이터는 다음과 같이 저장된다. Data.Buffer1=0은 b0=0,b1=0,b2=0이 저장되고 Data.Buffer1=1은 b0=1,b1=0,b2=0이 저장된다. 2020. 10. 28.
C 언어 math 정의 상수 C언어의 math.h에는 다음과 같은 상수들이 정의되어 있다. 하지만 C 표준에는 없기 때문에 컴파일러에 따라 정의되어 있지 않기도 하다. M_E : The base of natural logarithms. M_LOG2E : The logarithm to base 2 of M_E. M_LOG10E : The logarithm to base 10 of M_E. M_LN2 : The natural logarithm of 2. M_LN10 : The natural logarithm of 10. M_PI : Pi, the ratio of a circle’s circumference to its diameter. M_PI_2 : Pi divided by two. M_PI_4 : Pi divided by four... 2020. 10. 22.
C 나머지 연산 C에서 나머지를 구하는 연산자는 %이다. 다음과 같은 코드에서 i에는 1이 저장된다.i = 10 % 3; 다음과 같이 음수일 때는 i에 -1이 저장된다.i = -10 % 3; 다음과 같이 음수일 때는 i에 -1이 저장된다.i = -10 % -3; C에서 % 연산자는 다음과 같은 식이 성립하도록 정의되어 있다.a = (a/b) * b + a%b 2020. 10. 21.
C struct 구조체 사용하기 구조체는 다음과 같이 사용한다. struct Room { int name; int size }; struct Room room; struct Room room1; room.name = 1; room.size = 2; 다음과 같이 사용할 수도 있다. struct Room { int name; int size } room; room.name = 1; room.size = 2; 구조체는 다음과 같이 초기화할 수 있다. struct Room room = ; 구조체를 복사하기 위한 코드는 다음과 같다. 구조체는 같은 형식이어야 한다. memcpy와 동일한 동작을 한다.room1 = room; 2020. 10. 21.
C 구조체를 함수 리턴으로 사용하기 구조체를 함수의 리턴으로 사용할 수 있다. struct Card{int no;}; struct Card fun(){struct Card c;c.no = 10;return c;} void main(){struct Card card;card = fun();printf("%d", card.no);} 위 프로그램은 10을 출력한다. 2020. 10. 16.
C 언어 - 스트링 함수 string.h에 정의된 함수 memcpy : 메모리 복사memmove : 메모리 이동strcpy : 문자열 복사strncpy : 정해진 갯수만큼 문자열 복사 strcat : 문자열 연결strncat : 정해진 갯수만큼 문자열 연결 memcmp : 메모리 비교strcmp : 문자열 비교strcollstrncmp : 정해진 갯수만큼 문자열 비교strxfrm memchr : 메모리에서 검색strchr : 문자열에서 검색strcspnstrpbrkstrrchr : 문자열에서 검색strspnstrstrstrtok memset : 메모리를 특정값으로 채움strerrorstrlen : 문자열 길이 2020. 10. 1.
printf 정수형 포맷 d는 부호있는 정수이고 u은 부호없는 정수이다. long은 d와 u 앞에 l을 하나 붙이고 long long은 l을 2개 붙인다. %d : int %u : unsigned int %ld : long %lu : unsigned long %lld : long long %llu : unsigned long long 2020. 10. 1.
C 언어 - 문자열 C에서 문자열 또는 스트링(String)은 다음과 같이 사용한다. char Text[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; char Text[] = "Hello"; 위 스트링을 화면에 출력하는 함수는 다음과 같다. printf("%s"", Text); 여기서 printf 함수를 사용하기 위해서는 #include 를 해주어야 한다. 2020. 10. 1.
함수 인자와 매개변수의 차이 다음과 같은 함수를 사용하는 C 코드가 있을 때 함수 fun 선언에 사용되는 변수 a를 매개변수 또는 파라미터(Parameter)라고 한다. 함수의 파라미터 a에 전달되는 값 1을 인자(Argument)라고 한다. int fun (int a); fun(1); int fun(int a) { return a+1; } 즉, 매개변수(파라미터)는 변수를 의미하고 인자는 값을 의미한다. 2020. 10. 1.
C 언어 - 함수 기본적인 함수 사용법다음 함수는 파라미터 a에 값이 전달되고 return 값이 반환된다. int fun(int a){return 0;} void fun(void)파라미터나 리턴값이 없을 때는 void를 사용한다. 함수 선언 (Function Declaration)함수를 사용하기 위해서는 프로그램의 앞에 함수를 선언해야 한다. // 함수 선언void fun(void); // 함수 사용fun(); // 함수 정의void fun(void){ } 포인터 파라미터포인터를 파라미터로 사용하면 함수 내에서 파라미터 값을 변경할 수 있다. int fun(int *a) 배열 파라미터배열의 이름은 포이터를 나타내기 때문에 배열의 이름을 파라미터로 사용할 수 있다. int Text[10]; // 함수 사용fun(Text);.. 2020. 10. 1.
C 언어 - 연산자 연산자 + - * / % ++ -- ++ -- 연산자 순서 b = (++a) + 3 : ++a을 먼저 연산한 후 3을 더하여 b에 저장한다. b = (a++) + 3 : a에 3을 더하여 b에 저장한 후 a++을 실행한다. += 연산자 Cast 연산자 int i = (int)b (int)는 char 형인 b를 int 형으로 변환한다. 2020. 10. 1.
C 언어 - 데이터 형식 Data typechar 1 Byteunsigned char 1 Byteshort 2 Byteunsigned short 2 Byteint 4 Byteunsigned int 4 Bytelong 8 Byteunsigned long 8 Bytefloat 4 Byte Single-precisiondouble 8 Byte Doubel-precision Data의 바이트 크기는 컴파일러마다 다르다. char b = 'A'위의 코드는 b에 A의 아스키 값인 65가 대입된다. 'A'는 65와 완전히 동일하게 사용할 수 있다. 16진수0x는 16진수를 나타낸다. 즉, 0x10은 16진수이고 십진수로는 16이다. 2020. 9. 10.
C++ 함수 인자 기본값 C++에서 함수의 인자에 기본값을 설정할 수 있다. 이것을 디폴트 파라미터(Default parameter, Default arguements)라고 한다. 다음과 같이 함수를 정의한다. void fun(int x, int y=0) 위의 함수는 다음과 같이 사용할 수 있다. fun(1,1) fun(1) fun(1)는 fun(1,0)과 동일하게 실행된다. 2020. 6. 4.
C++ 특징 C++의 특징은 다음과 같다. ● 프로그래밍의 자유도가 높다. ● 객체지향 언어이지만 절차지향 프로그래밍도 강력하게 지원하는 언어이다. ● 객체지향, 절차지향, 일반화 프로그램의 3가지 특징을 가진다. ● 대부분의 C 프로그램은 C++에서 문제없이 컴파일된다. ● Simula에서 영향을 받았다. ● 성능 저하를 최소화 하는 방향으로 개발되었다. ● 메모리 관리를 직접해야 한다. 가비지 콜렉터가 없다. ● 예외 처리를 하면 성능 저하가 매우 크다. ● 다른 비슷한 객체지향 언어에 비해 속도가 매우 빠르다. ● 다른 비슷한 객체지향 언어에 비해 배우기가 매우 어렵다. ● C++이 C언어와 다른 고급 언어들 사이 애매한 위치에 있다고 비판하는 사람도 있다. 2020. 6. 3.
C++ 역사 1979년덴마크의 비야네 스트로스토룹 (Bjarne stroustrup)가 C with Classes을 만들었다. 1982년C with Classses을 발전시킨 C++ 개발을 시작한다. 1985년비야네 스트로스토룹의 책 "The C++ Programming Language"이 출간되고 최초의 C++가 출시된다. The C++ Programming Language 책은 C++가 표준으로 채택되기 전까지 사실상 표준과 같이 사용되었다. 1989년C++ 2.0 출시 1991년"The C++ Programming Language" 2번째 판이 출간된다. 1997년"The C++ Programming Language" 3번째 판이 출간된다. 1998년C++98 출시. ISO/IEC 표준으로 채택된다. (ISO/.. 2020. 6. 3.
C 코드와 C++ 코드를 함께 컴파일 extern "C" C++에서 extern "C"은 네임 맹글링을 하지 않도록 하는 키워드이다. 네임 맹글링을 하지 않으면 C 코드와 C++ 코드를 함께 컴파일할 수 있다. extern "C" 없이 C 코드에서 C++ 함수를 호출하거나 C++ 코드에서 C 함수를 호출하면 컴파일 에러가 뜬다. 예를들면, cpp 파일에서 다음과 같이 사용한다. extern "C" void fun1(void); extern "C" void fun2(void) { fun1(); } fun1 함수는 C 파일에 정의된 함수이고 fun2는 C++ 파일에 정의된 함수이다. 2020. 6. 3.
C++의 Name mangling Name mangling은 프로그램 코드를 컴파일 할 때 컴파일러가 함수나 변수 등의 이름을 바꾸는 것을 의미한다. 이렇게 바뀐 이름은 컴파일러 내부에서만 사용한다. Name mangling을 Name decoration이라고도 한다. 예를 들면, C++에서 같은 이름의 오버로드 함수 fun가 있다면 컴파일러는 __fun_v와 __fun_i와 같이 다른 이름으로 바꾸어 처리한다. Name mangling은 모든 언어에서 사용하지만 특히 C++은 Name mangling을 매우 많이 사용한다. Mangle은 '토막내다', '엉만으로 만들다'라는 뜻이다. 2020. 6. 3.
C언어 변수 교환 2개의 변수를 교환하는 C 코드는 다음과 같다.int a ,b;int temp;temp = a;a = b;b = temp; 위 코드에서 교환을 위해 임시변수 temp를 사용했는데 임시변수 없이 다음와 같이 XOR 교환 알고리즘 (XOR swap algorithm)으로 구현할 수도 있다.int a, b;a = a^b;b = a^b;a = a^b; XOR 교환 알고리즘의 일반식은 다음과 같다.a = a XOR bb = a XOR ba = a XOR b 위 식의 진리표는 다음과 같다.In Out a b a b 0 0 0 0 0 1 1 0 1 0 0 1 1 1 1 1 2020. 5. 17.
C 언어 exit 함수 C 언어에서 exit 함수는 프로세스를 종료하는 함수이다. 프로세스가 종료될 때 열려 있는 파일은 모두 닫힌다. exit(0) 이나 exit(1) 등으로 함수의 인수는 프로세스가 종료되고 운영체제로 전달되는 값이다. exit 함수는 심각한 에러가 발생했을 때 프로그램을 종료하기 위해 많이 사용된다. 이 때 에러 코드를 exit 함수의 인수로 전달한다. 2020. 5. 10.
return과 exit 차이 return은 함수를 종료할 때 사용한다. exit은 프로세스를 종료할 때 사용한다. main 함수에서 return은 프로세스를 종료한다. 즉, main 함수에서 사용할 때는 return과 exit는 동일한 동작을 한다. 2020. 5. 10.
C 언어 XOR 비트연산 C에서 XOR을 하는 비트 연산자는 ^ 이다. 제곱을 하는 연산자가 아니다. 예를 들면 다음과 같다. b1 = 0x03; // 00000101 b2 = 0x0C; // 00001100 b = b1 ^ b2; // 00001001 위 코드에서 b는 9가 된다. AND 연산자는 & 이고 OR 연산자는 | 이다. 2020. 5. 7.
C++ 클래스 사용 프로그램 코드 예 // 클래스 사용하는 코드 int sw, in1, in2, out; // 클래스 선언 Block b; // 클래스 사용 b.i1 = in1; b.i2 = in2; if (sw==0) out = b.Add(); else if(sw==1) out = b.Sub(); // 클래스 class Block {int i1, i2;int Add(){ return i1+i2; }int Sub(){ return i1-i2; } } 2020. 4. 23.
C++ 구조체와 클래스의 차이 C++에서 사용하는 class는 C에서 사용하는 struct와 매우 유사하다. C에서의 struct는 struct 멤버에 변수가 사용할 수 있지만 C++에서의 struct의 멤버는 변수뿐만 아니라 함수도 사용할 수 있다. C++에서 struct 멤버 변수는 기본적으로 public이지만 class는 기본적으로 private이다. 이 차이 이외에는 C++에서 struct와 class는 완전히 동일하다. 2020. 4. 23.
C 포인터 사용시 흔한 실수 C에서 포인터를 선언하고 사용시 다음과 같이 사용했을 때 어떤 문제가 뭘까? int *i; *i = 10; 첫번째 줄에서 i의 포인터를 선언하여 포인터가 저장되는 메모리 공간을 확보했다. 하지만 i의 포인터는 확보되었지만 i의 값이 저장되는 메모리 공간은 확보되지 않았기 때문에 *i에 값을 저장하면 어디에 저장될지 알수가 없다. 중요한 시스템 영역에 10이라는 값이 저장되어 심각한 문제가 될 수도 있다. 위 프로그램은 다음과 같이 고쳐서 사용해야 한다. int *i; int k; i = &k; *i = 10; k를 선언하여 값이 저장되는 메모리 공간을 확보하고 그 메모리 공간의 주소를 i에 할당하여 사용한다. 2019. 11. 14.
C의 abs와 labs와 fabs 함수 abs 함수는 다음과 같이 int 변수의 절대값을 계산한다. 에 있다.int abs(int x) labs 함수는 다음과 같이 long 형 변수의 절대값을 계산한다. 에 있다.long abs(long int x) llabs 함수는 다음과 같이 long long 형 변수의 절대값을 계산한다. 에 있다.long long abs(long int x) fabs 함수는 다음과 같이 double 형 변수의 절대값을 계산한다. 에 있다.double fabs(double x) 2019. 10. 17.
C의 min, max 함수 C에는 최소와 최대를 구하는 min, max 함수가 없다. 다음과 같이 min, max를 직접 정의하여 사용해야 한다. #ifndef max #define max(a,b) (((a) > (b)) ? (a) : (b)) #endif #ifndef min #define min(a,b) (((a) < (b)) ? (a) : (b)) #endif ☞ 삼항 연산자 2019. 10. 17.
[C] 포인터의 이해 포인터는 주소를 저장하는 변수이다. 포인터의 변수 크기는 보통 4 Byte이다. C에서 변수를 포인터 변수와 포인터가 아닌 일반 변수의 2 종류로 구분하다면, "*[포인터 변수]"는 포인터 변수(즉, 메모리 주소)가 가르키는 변수의 값이 되고, "&[일반 변수]"는 일반 변수의 포인터(즉, 메로리 주소)가 된다. 일반적으로 포인터 변수와 일반 변수을 함께 연산하거나 대입하지 않지만 캐스트 연산자로 변환하여 할 수는 있다. 함수의 포인터 C 함수의 포인터는 다음과 같이 사용한다. void fun(int a) { printf("a=%d", a); } void main() { void (*pfun)(int) = &fun; (*pfun)(1); } 2019. 2. 5.
C++ 연산자 오버로드 C++에서 연산자 오버로드 (Operator Overload)란 +,-*,/ 등의 연산자를 클래스 연산을 위해 제정의할 수 있는 것을 의미한다. 다음 코드와 같이 클래스 CText가 있을 때 클래스 CText 내부에서 =과 + 연산에 동작을 각각 코딩하여, =와 + 연산자를 클래스에 바로 사용할 수 있다. CText text1; CText text2; CText text3; text1 = "Text1"; text2 = "Text2"; text3 = text1 + text2; 2018. 8. 13.
반응형