일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 마영전
- Qt 소켓프로그래밍
- 재귀함수
- 윈도우7
- QTcpServer
- FFI
- c언어
- vuejs
- 스타2
- 자료구조
- 스타크래프트2
- 양평역
- 잡담
- android SAF
- 자바
- 알람프로그램
- 엑티브엑스
- 오토바이
- 정성하
- Java
- HTML
- 디자이어HD
- 고속도로
- 안드로이드
- 바이크
- 이륜차
- qt 설치
- QT
- Qt4
- Qt OpenGL
- Today
- Total
목록c언어 (14)
프로그래밍과 잡담
함수 포인터를 안쓴거 같네.. 그래서 쓴다.. 함수 포인터란.. 포인터와 같이 함수를 가르키는 포인터이다.. 일반 적인 포인터는 변수를 가르키지만 함수 포인터는 함수를 가르킨다. 사용법은 간단하다. int add(int a, int b); //이런 함수 가 있다. int (*pAdd)(int,int); //이건 함수 포인터이다. pAdd = add; //이렇게 사용하면 된다. int b = pAdd(5, 6); //결과 b = 11 이렇게 사용하면 된다. 주의 해야 할께 있는데 함수 포인터는 반드시 원형에 맞춰서 만들어야한다. void (*pAdd)(int,int) // 이렇게 하면 안된다. 마찬 가지로 int (*pAdd)(double,int) //이렇게 써도 안된다.
재귀 함수란? 자기 자신을 자기가 호출을 하는걸 보고 재귀 함수한다. 예제) void t( ) { t(); } 예제와 같은 형태를 가진 함수를 보고 재귀함수한다. 물론 저렇게 실행하면 무한루프에 빠져서 컴이 에러난다. 재귀함수를 사용할때는 함수의 끝나는 조건을 잘 써야한다. 종료 조건을 제대로 안하면 무한 루프에 빠져서 프로그램이 멈춘다. 재귀 함수의 장점은 함수가 간략해 진다는 장점이 있는데 단점은 햇갈린다. 자기가 자신을 호출하다보니 햇갈리는 문제가 생긴다. 예제) int power(int i, int n) { if( n == 1) return i; else return power(i*2,n-1); } 위에 예제는 2^n 을 하는 재귀 함수이다. 재귀함수는 상당히 보기가 짜증나기 때문에 공책을 준비 ..
동적 할당(Memory Allocation) 자 인제 이것만 하면 다 한거 같네.. 동적할당 프로그래머가 필요할때 메모리에 올리고 지울때 사용하는게 동적할당이다. (데이터타입*)malloc(sizeof(크기)) 위에 처럼 사용하면 된다. *표는 오타가 아니라 포인터로 반환한다는거다. 아 그러고 보니 형변환 안했네.. 뭐 그냥 지금 하지 ***************************************** 형변환 형변환 하는거 쉽다 위에서 써 놓은거 처럼 '( )' (캐스트연산자) 여기다가 데이터타입을 넣으면 데이터 타입이 일시적으로 변환된다. 계속 바뀌는것이 아니다. int i = 43; printf("%c", (char)i)); 위에 처럼 사용하면된다 i를 char형으로 형변환한거다. 묵시적 형변..
Call by Value & Call by Reference Call by Value 와 Call by Reference를 쓰겠다.. 함수에서 Call by Value 와 Call by Reference 라는게 있다.. 책들 보면 Call by Value 와 Call by Reference 를 설명하는거 보면 대부분은 swap이라는걸 쓴다.. 고로 나도 쓴다. 이유는 그냥 보여주기 쉬우니까.. 예제 ) void swap(int a); void swapt(int* a); int main() { int a = 0; int b = 0; printf("before swap() %d \n",a); swap(a); printf("after swap() %d \n",a); printf("before swapt() %..
함수(function) 함수란 사전에서 보면 기능이란 뜻이다. printf 함수 이건 콘솔창에 메시지를 띄우라는 함수다. 이러한 기능을 가진걸 함수라 한다. 함수를 사용하는 이유는 그냥 main 함수 안에다가 다 넣어버려도 작동은 아주 잘 된다. 근데 그렇게 하다보면 메인이 엄청 길어져서 보기도 나쁘고 나중에 유지보수하는데 어려워지게 때문에 함수라는걸 만들어서 여러게로 쪼개서 사용한다. 함수의 사용법도 다른거와 마찬가지로 쉽다. 함수의 형태 리턴타입 함수이름 ( 인자 ) { 내용부 } 리턴 타입은 int 와 같은게 있을 수 도 있고 배열이 있을 수도 있고 구조체가 있을 수도 있다.. 즉, 프로그래머 마음대로 원하는 타입을 설정하면된다. 단! 한개의 타입만 리턴된다. 이런거 없다. int,char fnc(..
구조체 [Structure] 구조체는 여러가지의 데이터타입들의 집합을 구조체라 한다. 배열과는 틀리다.. 배열은 같은 형태의 데이터타입들의 집합이지만 구조체는 int, float ,char 이렇게 여러가지로 만들어진 집합체이다. 구조체의 사용법은 간단하다.. struct 구조체 이름 { 내부내용 }; 예제) struct structure { char c; int i; float f; double d; }; 위에 예제와 같이 하면 된다. 함수 안에다가 설정하면 안된다. 함수 밖에다 만들어야 한다. 사용법 사용법은 위에 처럼 만들었으면 이렇게 사용하면 된다.. 예제) void main() { struct structure s; } 위에 처럼 일반적인 변수 선언을 하는것 처럼 하면 된다. 그러면 내부에 있는 ..
다중 포인터. 다중 포인터 이것도 사용하는 방법은 포인터와 같다. int **p; 이렇게 하면 2중 포인터가 된다.. 2중이나 3중은 좀 쓰는데 4중이나 5중같은거는 거의 안쓴다.. 이유는 머리 아프니까.. 2중 포인터의 예제 int p = 1; int *ap; int **app; ap = &p; app = ≈ printf("p의 값 %d \n", p); printf("p의 주소 값 %x \n",&p); printf("ap의 값 %d \n", *ap); printf("ap의 주소 값 %x \n",ap); printf("app의 값 %d \n", **app); printf("app의 주소 값 %x \n",app); 출력 결과 p의 값 1 p의 주소 값 12ff60 ap의 값 1 ap의 주소 값 12f..
포인터 연산 포인터도 연산이 가능하다. 막 아무거나 가지고 연산하면 이상한걸 가르키기 때문에 연산을 할때는 배열같은걸 사용할때 사용한다.. 배열의 이름은 포인터라 했다.. 물론 1차원 배열일때만이다.. 2차원으로 가면 좀 틀려진다.. int array[5]; int *pa; // pointer array라는 줄임이다. pa = array; 위에 처럼 하면 pa는 array의 주소값을 가지게 된다.. 정확히는 array[0]의 주소값을 가지게 된다. 이걸 가지고 포인터 연산을 한다.. pa++를 하면 pa = pa + 1; 이라는 의미이다.. 여기서 1이라는 의미는 int 형의 크기만큼 이동한다는 소리다.. 뭔 소리인가 하면 그림으로 설명.. 자 pa = array;를 한 상태의 그림이다 .. 그 다음 그..
포인터 포인터.. C나 C++ 언어에는 포인터라는 걸 쓴다.. 자바나 C#은 포인터를 쓰지 않는다.. 물론 내부적으로는 포인터를 쓰겠지만 프로그래머 입장에서는 못쓴다.. 포인터란.. 주소값을 갖는 변수를 의미한다... 쓰는 방법은 쉽다.. int *pointer; 변수명 앞에 * 곱하기 기호를 붙이면 포인터가 되는거다.. 쓰는 법도 여러가지다 . int* pointer; int * pointer; int *pointer; 이렇게 3가지 인데. 가운데꺼는 잘 안쓰고 위 나 아래껄 주로 쓴다. 그리고 포인터 변수의 크기는 모두 4byte의 크기를 가진다.. double 이던 뭐던 간에 말이다.. 정의는 이거다.. C언어 배우면 사람들이 포인터가 어렵다고하는데... 너무 어렵게 생각하지말고 주소 값을 갖는 변..
배열 배열. 영어로는 array... 배열의 사용법은 간단하다. int a[10]; 이렇게 하면 배열이 생성된다. 배열을 사용하는 이유는 int a int b int c int d 이렇게 긴거를 생성할려면 이름 지어야하고 만들어야 하니까 귀찮잖아. 그래서 만든게 배열이다 . 배열은 메모리 상에 이어져서 만들어진다.. 뭔 말인가 하면 위에 그림 보면 0x00001이 a[0]이다 그다음에 0x00002는 a[1]이고 메모리상에 일자로 되어 있다는거다. 배열이란 데이터형이 묶여있는 형태를 보고 배열이라 한다. 배열의 이름은 즉 위에서 쓴 a 는 배열의 첫번째 주소값을 가지고 있다. a 라는 이름에는 0x00001을 가지고 있는 뜻이다. 나중에 포인터에서 설명.. 배열의 초기화 int a[10]; a[0] = ..