본문 바로가기

Windows Developer/C

[C] main(int argc, char *argv[])에서 포인터를 쓰는 이유? main(int argc, char *argv[])는 프로그램하면서 많이 쓰는 부분입니다. argc는 파라미터 입력의 개수를 나타냅니다. 예를 들어 프로그램이 test_run이라고 가정하면 test_run하면 argc는 1이되고 test_run abc하면 argc는 2가 됩니다. 즉 파라미터 개수 +1이 됩니다. 이유는 파라미터를 입력하지 않더라도 자동적으로 하나의 파라미터가 들어가게 되어 있습니다. char *argv[]는 1차원 포인터 배열 입니다. 포인터는 일반적으로 할당된 메모리 영역에 대해서 주소를 확보하기 위해서 사용욉니다. 예를 들어보겠습니다. char a[] = "123"; char *p = a; printf("%s\n", a); printf("%s\n", p); 위에서 보면 printf의.. 더보기
[C] 재귀함수 재귀 함수란 함수를 재호출 하는 것을 말합니다. 재귀에는 직접 재귀 함수와 간접 재귀 함수가 있습니다. - 직접 재귀함수 예제 : 자신의 함수를 직접 호출 void a() { a(); } - 간접 재귀함수 예제 : 다른 함수에서 서로 호출 void b() { a(); } void a() { b(); } 간접 재귀함수는 거의 사용되지 않으므로 직접 재귀함수를 공부해 보도록 하겠습니다 재귀함수는 루프와 약간 비슷한 면이 있습니다. 명령어를 반복 처리한다는 것이죠. 다른 점은 명령어들을 반복 처리만 하는 것이 아니라 함수 호출 스택이라는 것을 이용합니다. 그래서 명령어들을 하나의 단위로 다루면서도 스택 자료 구조의 이점까지도 쉽게 얻을 수 있다는 것입니다. 루프처럼 재귀함수는 종료 조건을 잘 만들어야 합니다... 더보기
[C] 동적 메모리 동적 메모리는 프로그램 실행시간에 메모리를 할당 받아 사용합니다. 말 그래도 '동적메모리'입니다. 프로그램 실행시에 사용자가 직접 필요한 메모리를 생성하고 프로그램 실행시 사용자가 직접 삭제할 수 있습니다. 보통 프로그램 중 가장 많은 메모리 공간을 사용합니다. 동적 메모리는 Heap 영역에 생성되며 저장소 키워드나 변수가 따로 존재 않고 malloc()함수를 사용하여 메모리 할당 후 주소를 이용한 메모리 접근 방식을 사용합니다. 동적 메모리 할당 malloc() 함수 사용 - 몇 가지 함수가 더 있지만 응용함수 일뿐 모두 malloc()함수의 확장형태입니다. 동적 메모리 삭제 free() 함수 사용 가장 간단한 예제 #include #include void main( ) { int *pn; pn = m.. 더보기
[C] call by value와 call by reference call by value : 값의 복사에 의한 함수 호출 #include void main() { int val1 = 10, val2 = 20; int swap(int, int); swap(val1, val2); printf("val1 : %d\n", val1); printf("val2 : %d\n", val2); } int swap(int a, int b) { int temp = a; a=b; b=temp; printf("a : %d\n", a); printf("b : %d\n", b); return 0; } a : 20 b : 10 val1 : 10 val2 : 20 swap함수가 끝났음에도 불구하고 val값은 변하지 않았다. 변수 a와 b에 복사해서 보냈기 때문에 val값은 변하지.. 더보기
[C]포인터의 장점 포인터랑 일반 변수와는 달리 메모리 주소를 저장하는 변수를 말한다. 일반적으로 변수는 특정 값을 저장하는데 반해 포인터는 특정 메모리 주소를 저장하며 저장한 메모리 주소에 저장되어 있는 값을 읽어 올 수 있다. 특정 메모리 주소를 저장하고, 주소에 저장된 값을 읽어 올 수 있다는 특징 때문에 포인터는 많은 상황에서 아주 유용하게 사용할 수 있다. 메모리상에 연속적으로 저장되어 있는 배열을 조작할 때에도 포인터를 이용하면 편리하다. 또한 포인터는 저장하는 값의 성질에 따라 크기가 변하는 일반 변수와는 달리 포인터 변수는 타입에 관계없이 항상 4바이트를 유지한다. 크키가 100kb가 넘는 구조체, 클래스를 가리키는 포인터라 할지라도 포인터 자체 크기는 항상 4바이트이다. 그렇기 때문에 함수의 인수로 넘기는 .. 더보기