분류 전체보기 (505) 썸네일형 리스트형 Chapter 15. 함수 인자 포인터 Chapter 15.함수 인자 포인터 함수에 인자 넘기는 포인터는 지칭한다. 이것을 잘 모르면변수를 잘 정의하고 사용할 지라도 다른 함수에 넘길 수 없기때문에 현재의 함수 안에서만 포인터 변수를 사용하게 될지도 모른다. 1차원 함수 인자 포인터 15_1.c #include main() { void add(int *); int imsi; imsi = 100; add(&imsi); printf("imsi : %d\n", imsi); } void add(int *imsi) { *imsi = 1024; } gcc-o 15_1 15_1.c ./15_1 imsi : 1024 위 프로그램은 포인터를 다른 함수에 넘기기 위해서 어떻게 함수의 원형을 선언하고 본체는 어떻게 작성해야 하는지 그리고 호출할 때 주의할 것은 .. Chapter 16. 함수 포인터 Chapter 16.함수 포인터 함수를 가리킬 수 있는 포인터!! 많이 사용되지는 않지만 수치해석과 같은 분야에서 함수 포인터가 없다면 상당히 프로그램이 복잡해짐을 느낄 수 있을 것이다. 트리를 순회하는데 재귀함수 기능이 없다면 구현에 훨씬 많은 시간과 노력이 필요할 것이다. 함수 포인터의 개념과 기본적인 활용에 대해 간단히 짚고 넘어가자. 함수 포인터의정의 type (*name)(arg list); "name"은 함수를 가리킬 수 있는 포인터 변수이다. 그러므로name에 대한4byte가 할당된다. "type"은name이 가리키는 함수가 리턴하는 형(type)을 말하고,"arg list"는 name이 가리키는 함수의 매개변수 리스트이다. int (*imsi)(int, char *); imsi가 가리키는 .. Chapter 17. 구조체와 포인터 Chapter17.구조체와포인터 구조체의 정의하면 다음과 같이 2가지로 말할 수 있겠다. 변수들이 모여 있는 집합체이다. 변수들은 다른 타입을 가질 수 있다. 이 집합체는 논리적으로 관련이 있으며 하나의 이름으로 통칭한다. 사실 구조체를 사용하지 않고 배열을 사용할 수도 있다. 하지만, 구조체를 사용하면 변수들이 논리적으로 하나가되기 때문에 인식하기가쉽고 프로그래밍을 하기도 편하다. 구조체와 배열의 차이 주소록에는 이름과 생년월일, 주소, 전화 번호 등이 포함되어 있다.이를배열로 표현하면 아래와 같다. char name[20],address[100], birthday[11], phone[15]; 위의 배열 정의는 한 사람만 저장할 수 있으며, 만약 50명을 저장하려 한다면 2차원 배열을 이용해야 한다. .. Chapter 13. (int *)pointer Chapter 13.(int*)pointer int pointer= 5; (int *)pointer (int *)pointer를 이용해서 나온 값과 그냥pointer를 이용해서 출력되는 값은 어떤 차이점이 있을까? 캐스트 연산자의 이해 13_1.c #include main() { int pointer = 5; printf("(int *)pointer = %#010x\n", (int *)pointer); } gcc -o 13_1 13_1.c ./13_1 (int *)pointer = 0x00000005 위의예제를통해 결과를확인하기 전에"5가 메모리 어딘가에 저장디어 있고이곳의 번지를 리턴할 것이다"라고 예상한다. 하지만, pointer변수에 들어 있는 정수 값이 출력된다. 위의 질문에 대한 결론을 말하자면.. Chapter 14. void형 포인터 Chapter 14.void형 포인터 널 포인트는 아무것도 가리키지 않는 포인터였다. void형 포인트는 그와 반대로어느 것이든 가리킬 수 있는 포인터이다. 좀더 자세히말하면void형 포인터는 현재 가리키고 있는 대상체가 정해져 있지않은 포인터가 된다. void *imsip; imsip는가리키는 대상체가 정해져 있지 않은 포인터 변수라고 정의했다. 따라서,imsip 안에는 분명 주소 값이 저장되어 있을 것이다. 그렇다면, 현재 가리키고 있는 주소 값에서 몇 byte를 읽어올 것인가에 대한 질문이 된다. imsip 자체는 가리키는 대상체가 따로 지정? 있지 않기 때문에 몇byte를 읽어올 지 알 수가 없다. void형포인터변수가 가리키는 주소에서 몇byte를 읽어올 지 결정하는 것은캐스트 연산자이다. vo.. Chapter 10. 바로알자 getchar() Chapter 10.바로알자getchar() 특히 초보자에게황당한논리적인 에러를 짚고 넘어가자. 10_1.c #include main() { int input_char = 0; while(1) { printf("Input character : "); input_char = getchar(); if((input_char == 'y') || (input_char == 'Y')) puts("OK, 'y' input"); else puts("NO"); } } gcc -o 10_1 10_1.c ./10_1 Input character : y OK, 'y' input Input character : NO Input character : n NO Input character : NO Input character : .. Chapter 11. 가변 인자 Chapter 11.가변 인자 마을 풀어보면 "인자가 변한다"가 될것이다. 정학한 뜻은 인자의 개수가유동적으로 변한다는 것이다. 따라서, 지금까지 인자의 개수를 한정지어 작성되었던 프로그램(인자의 개수에 따라 처리 함수가 여러개 존재하는)을 훨씬 간단하게 작성할 수 있다. 가변 인자 사용 단계 1. 함수의 원형 정의 int function(int, ...); 인자 리스트에"..."을 사용한다. 2. 함수의 본체 작성 int function(intcount, ...) { } 함수본체에서는 원형에서 생략했던 변수명을사용해야 한다는 것을 제외하고는원형과 크게 다르지 않다. 3. 헤더 파일 포함 #include 위처럼 헤더 파일을 포함해야 가변 인자를 사용할 수 있다. 가변 인자를 위한 매크로 가변 인자를 위한.. Chapter 12. 될 것 같으면서 안 되는 코드 Chapter 12.될 것 같으면서 안 되는 코드 초보자들이 아무리 들여다봐도 결국에는 해결하지 못하고나중에는 편법을 자행하는 대표적인것으로쓰레기 주소 값이다. char *imsip; strcpy(imsip, "archie"); 현재 imsip가 가리키는 번지는 쓰레기 값이므로 문제가 발생한다. 이를 해결하려면malloc()을 사용하는 것인데 사용할 때마다 추가해 주어야 하는 번거로움이 있다. 이를대신 해주는 함수를 이용한 프로그램을 작성해 보자. 더불어 하나의 문자열 뿐만 아니라 여러개의 문자열도 처리할 수 있도록 해보자. 12_1.c #include #include // malloc(), NULL #include // va_start(), va_arg(), va_end() #include // str.. 이전 1 ··· 15 16 17 18 19 20 21 ··· 64 다음