윤성우의 C Programming (20) 썸네일형 리스트형 포인터 배열과 포인터 배열의 포인터 형 포인터 배열은 포인터들의 배열이다. 즉, 배열의 각 요소가 메모리 주소를 저장하는 포인터 변수입니다. 이를 통해 여러 위치에 저장된 데이터에 대한 참조를 배열 형태로 관리할 수 있다. 포인터 배열은 특히 문자열이나 다양한 데이터 구조의 배열을 다룰 때 유용하다. 포인터 배열의 기본 구조 타입 *배열이름[배열크기]; 타입: 배열이 가리킬 데이터의 타입 배열이름: 배열의 이름 배열크기: 배열이 저장할 포인터의 개수 #include int main() { // 문자열을 가리키는 포인터의 배열 선언 const char *days[7] = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" }; // 포인터 배열을 이용해 요.. Chapter 14. 포인터와 함수에 대한 이해 1. 함수의 인자로 배열 전달하기 인자전달의 기본방식은 값의 복사이다 노트북에 있는 영화를 큰 스크린으로 보고 싶을 때 여러분은 어떤 방법을 쓰는가? 노트북에 있는 영화를 USB로 옮겨서 볼 수도 있고 미러링으로 볼 수도 있다. USB로 영화를 복사해서 옮기는 것은 마치 인자전달의 기본방식과 같다. 즉, 함수호출 시 전달되는 인자의 값은 매개변수에 복사가 된다. 꼭 기억해야 할 점은 복사가 되는 것 뿐이기 때문에 매개변수의 값을 변경한다고 해서 인자의 값이 변경되지 않는다는 것이다. 이것이 인자전달의 기본방식이다. #include void swap(int n1, int n2) { int temp = n1; n1 = n2; n2 = temp; printf("n1 n2: %d %d \n", n1, n2); .. Chapter 12. 포인터의 이해 주소 값의 저장을 목적으로 선언되는 포인터 변수 변수가 선언되면, 메모리 공간에 다음과 같이 할당된다. int main(void) { char letter1='A'; //char는 1바이트 char letter2='B'; int num = 10; // int는 4바이트 ... } C언어에서는 시작 번지만을 가지고 위치를 표현한다. 따라서 정수 10인 공간의 위치를 표현할 때는 이렇게 말한다. "정수 10은 0x12ff72 번지에 할당되어 있다. " 그런데 주소 값 0x12ff72 역시 정수이기 때문에 이것도 저장이 가능한 값이며, 이의 저장을 위해 마련된 변수가 '포인터 변수' 이다. 즉 포인터 변수란 메모리의 주소 값을 저장하기 위한 변수이다. 참고로 예시의 메모리 블록 주소 값은 8자리로 이루어져있는.. Chapter 13. 포인터와 배열 포인터와 배열의 관계 배열의 이름 자체는 포인터이다. 즉 메모리 블록의 시작 주소 값을 가지고 있고 출력도 할 수 있다. 단, 일반 포인터 변수는 주소 값의 변경이 가능하지만 배열의 이름은 주소 값을 변경할 수 없다. 그래서 배열의 이름을 상수 형태의 포인터라고도 하고, 포인터 상수라고 부르기도 한다. int main(void) { itn arr[3] = {0,1,2}; printf("배열의 주소 값 : %p \n", arr); // %p는 주소 값의 출력에 사용되는 서식문자이다. printf("배열의 첫번째 주소 값 : %p \n", &arr[0]); printf("배열의 두번째 주소 값 : %p \n", &arr[1]); printf("배열의 세번째 주소 값 : %p \n", &arr[2]); //a.. 두 개의 텍스트 파일 비교하기 두 개의 텍스트 파일이 같은지 다른지를 확인하는 프로그램을 작성해 보자. 단순히 공백문자 하나가 차이를 보여도 두 텍스트 파일은 다른 것으로 판별이 나야 한다. # 실행의 예 /*다음은 실행파일의 이름이 comp.exe 이고, 비교의 대상이 되는 두 파일의 이름이 각각 d1.txt 와 d2.txt인 경우의 실행의 예이다.*/ C:\test>comp d1.txt d2.txt 두 개의 파일은 완전히 일치 합니다. 헤더 파일 포함하기 #define _CRT_SECURE_NO_WARNINGS #include #include #define _CRT_SECURE_NO_WARNINGS scanf_s 등을 사용하고 싶지 않을 때 컴파일러가 보안 관련 경고를 발생시키지 않도록 할 수 있다. #include 표준 입출력 .. A와 P로 시작하는 단어의 수를 세어서 출력하기 문자열을 저장하고 있는 파일을 열어서 A와 P로 시작하는 단어의 수를 세어서 출력하는 프로그램을 작성해보자. 단 , 모든 단어는 공백문자(스페이스바, \t, \n)에 의해서 구분된다고 가정한다. 실행의 예 실행파일의 이름이 wordcnt.exe. 이고 대상파일의 이름이 text.txt 인 경우의 실행의 예 C:/>wordcnt text.txt A로 시작하는 단어의 수 : 4 P로 시작하는 단어의 수: 3 도전 4의 해결을 위한 가이드 이번 문제의 구현방법은 참으로 다양하다. 그런데 어떠한 방법을 쓰건 공백문자를 기준으로 단어를 뽑아내야 한다. 참고로 fscanf, scanf 함수 모두 공백을 기준으로 문자열을 구분한다. 변수 선언 및 초기화 #include int main(int argc, char *a.. Chapter 27. 파일의 분할과 헤더파일의 디자인 1. 파일의 분할 수납장이 하나보다는 여러개가 있으면 관련있는 물건을 수납장별로 보관할 수 있는 것처럼 파일도 여러 곳이 용도 별로 저장해두면 효율적으로 사용할 수 있다 .그런데 단순히 파일을 나눠놓기만 하고 컴파일러에게 파일이 나눠져있다는걸 알려주지 않으면 컴파일 오류가 날 것이다. 컴파일러는 파일 단위로 컴파일을 진행하기 때문이다. 이때 필요한 것이 extern 선언이다. extern int num; // 컴파일러야 int num 은 외부 파일에 있어 다른 파일에서 접근 못하게 하려면 static ! 이 변수의 접근범위는 파일 내부로 제한한다는 뜻이다. 2. 둘 이상의 파일을 컴파일하는 방법과 static에 대한 고찰 방법 1 : 이미 만들어진 파일을 프로젝트에 추가 방법 2: 프로젝트에 파일을 추가.. Chapter 26. 매크로와 선행처리기 (Preprocessor) 1. 선행처리기와 매크로 실행파일은 컴파일 이전에 '선행처리' 라는 과정을 거치게 된다.선행 처리 명령문은 # 으로 시작을 하며, 컴파일러로 처리되는게 아니라 선행처리기로 처리되기 때문에 뒤에 세미콜론을 붙이지 않는다. 또한 컴파일러는 선행처리기의 명령을 이해하지 못한다. #include 컴파일 과정을 거치게 되면 소스코드가 운영체제가 이해할 수 있는 바이너리 데이터로 이루어진 오브젝트 파일이 생성된다. 그렇다면 컴파일 이전에 이루어지는 선행처리기에서는 어떤 처리가 이루어지는 걸까? 선행처리의 과정을 거쳐서 생성되는 파일도 그냥 소스코드일 뿐이다. 단지 선행처리 명령문대로 소스코드 일부를 수정하는 단순 치환(substitution) 의 과정을 거칠 뿐이다. 2. 대표적인 선행처리 명령문 #define: .. 이전 1 2 3 다음