C 언어/[책 정리] 혼자 공부하는 C언어
![포인터 완전 정복을 위한 포인터 이해하기 (1)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgFKQX%2FbtrUghGDf7Z%2Fjr3qkauLdQCKFgtj8BH7Mk%2Fimg.png)
포인터 완전 정복을 위한 포인터 이해하기 (1)
포인터는 주소를 저장하는 일정한 크기의 메모리 공간이다 주소와 포인터의 차이 주소 변수에 할당된 메모리 저장 공간의 시작 주소 값 자체 '상수' 포인터 그 값을 저장하는 또 다른 메모리 공간 '변수' *즉 두 포인터가 같은 주소를 저장하는 일도 가능해짐 주소와 포인터의 크기 포인터의 크기는 저장할 주소의 크기에 따라 결정됨 포인터의 크기는 컴파일러에 따라 다를 수 있다 모든 주소와 포인터는 가리키는 자료형에 관계없이 크기가 같다 #include int main(void) { char ch; int in; double db; char* pc = &ch; int* pi = ∈ double* pd = &db; printf("char형 변수의 주소 크기 : %d\n", sizeof(&ch)); printf..
![포인터의 기본 개념 (2)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVcMAD%2FbtrT4ertbKR%2FPLkMBsSbdlk9KzuOu3EwKK%2Fimg.png)
포인터의 기본 개념 (2)
간접 참조 연산자 * , const를 사용한 포인터 포인터와 간접 참조 연산자 : * 포인터 주소를 저장하는 변수로 일반 변수와 마찬가지로 선언 후에 사용한다 (선언할 때 변수 앞에 *만 붙여준다) #include int main(void) { int a; // 일반 변수 선언 int *pa; // 포인터 변수 선언 pa = &a; // 포인터에 a의 주소값 대입 *pa = 10; // 포인터로 변수 a에 10 대입 printf("포인터로 a 값 출력 : %d\n", *pa); printf("변수명으로 a 값 출력 : %d\n", a); return 0; } *pa == a ==> 값이 같은 걸로 보았을 때 위에 코드처럼 포인터 pa와 변수 a는 같다는 것을 알 수 있다 int *pa; ==> 포인터의 ..
![포인터의 기본 개념 (1)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzlmee%2FbtrT4G17xPc%2FzdhkDExMMHzH9x6bV2lplK%2Fimg.png)
포인터의 기본 개념 (1)
포인터를 시작하기에 앞서.. 지금까지 변수 선언으로 메모리 공간을 확보하고, 그곳을 데이터를 넣고 꺼내 쓰는 공간으로 사용했다. 변수명은 그러한 메모리 공간을 식별할 수 있는 이름이었다 그러나 변수는 선언된 블록 {} 또는 함수 내부로 사용이 제한되어 있다. 그래서 사용 범위를 벗어난 경우도 데이터를 공유할 수 있는 방법인 포인터를 알아야 한다! 메모리의 주소, 주소 연산자 & 메모리의 주소 메모리라는 것은 우리가 데이터를 넣고 꺼내 쓰는 공간으로, 그 위치를 식별할 수 있어야 한다 프로그램이 사용하는 메모리의 위치를 주소 값으로 식별할 수 있다 메모리의 위치를 식별하는 주소 값은 바이트 단위로 구분된다 0부터 시작하고 바이트 단위로 1씩 증가하므로 2바이트 이상의 크기를 갖는 변수는 여러 개의 주소 값..
![문자를 저장하는 배열](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP5IVE%2FbtrTlsqhOTV%2FuH8fGb1ZAmqK7s7KlGwl8K%2Fimg.png)
문자를 저장하는 배열
char형 배열의 선언과 초기화 char형 배열을 선언할 때 저장할 문자열의 길이보다 최소한 하나 이상 크게 배열을 선언 여분의 공간이 필요한 이유 ==>널 문자 (\0)를 저장하기 위해서 1) 문자 상수로 하나씩 초기화 char str[80] = {'a', 'p', 'p', 'l', 'e', 'j', 'a', 'm'}; ==> 이렇게 해도 가능하지만 쉽지 않다 2) 문자열 상수로 한 번에 초기화 char str[80]= "applejam"; ==> 문자열 초기화는 대부분 이렇게 한다 널 문자의 용도 널 문자란 char형 배열에 저장된 0을 의미 문자열의 끝을 표시 *char형 배열 선언 시 초기화하지 않은 경우 char str[80]; // 배열 선언, 초기화 아직 안됨 str[0] = 'a'; // ..
![배열의 선언과 사용](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdWEkyj%2FbtrTtjyMIFV%2F1G7PT7KjPpT6hx5zoz6bAk%2Fimg.png)
배열의 선언과 사용
배열의 선언 배열 또한 다른 자료형처럼 선언을 통해서 저장 공간을 확보하고 한 번에 변수를 여러 개 선언한다 int형 변수 5개를 하나씩 선언하는 것의 크기 = 전체 저장 공간의 크기 ==> 변수는 각각의 공간에 이름을 지칭한다 ==> 배열은 메모리에 연속된 공간이 할당되며, 하나의 이름을 사용한다 ==> 배열은 각 저장 공간을 이름과 첨자로 구분하고 첨자는 0부터 시작한다 배열의 사용 ==> 배열을 선언할 때 대괄호 ([])는 전체 개수를 의미 ==> 배열 요소를 사용할 때 대괄호 ([])는 각 요소가 배열에서 몇 번째에 있는지를 의미 *배열의 첨자가 사용 범위를 벗어난다면 컴파일러가 경고 메세지를 알려주기도 하지만 에러 메세지를 표시하지 않을수도 있어서 버그를 잡기가 쉽지 않아진다 처음부터 사용할 때..
![여러 가지 함수 유형](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1oSwz%2FbtrTegDg3eT%2FrPBP8bTS6nQKKDULuUyffK%2Fimg.png)
여러 가지 함수 유형
매개변수가 없는함수 예를 들어 키보드로 수를 입력해서 양수를 반환하는 함수를 만든다면 호출한 함수로부터 값을 받을 필요가 없으므로 매개변수도 필요 없게 된다 #include int get_num(void); int main(void) { int result; result = get_num(); printf("반환값: %d", result); return 0; } int get_num(void) // 매개변수는 없고 반환형만 있다 { int num; printf("양수 입력: "); scanf("%d", &num); return num; // 반환형 } 반환값이 없는 함수 데이터를 받아서 단지 화면에 출력하는 함수라면 특별히 반환값이 필요 없다 #include void print_char(char ch, ..
![함수의 작성과 사용](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaS4sx%2FbtrS7tWOMbE%2FK1vNffLRSYdzPoXe6S6OI0%2Fimg.png)
함수의 작성과 사용
함수 기능을 수행하는 코드 단위 표준 라이브러리 함수 특정 기능을 미리 약속하고 프로그램에서 바로 사욯할 수 있게 구현되어 있는 함수 ex) printf, scanf = (stdio.h 헤더 파일에 포함되어 있다) 함수의 3가지 상태 함수 정의 실제 코드로 함수를 만드는 것이며 기능을 구현 반환형 함수명(매겨변수1, 매개변수2)
![반복문 활용](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3mHTp%2FbtrS0EdCEt9%2FxNKluhkQevfI7apMu4ehH1%2Fimg.png)
반복문 활용
중첩 반복문과 break, continue 제어문 중첩 반복문 중첩 반복문은 반복문 안에 실행할 문장으로 반복문이 포함된 것이다. 중첩 반복문 사용 시 주의점 중첩 반복문에서는 각 반복문이 서로 독립적인 제어 변수를 사용해야 각각 원하는 횟수를 반복할 수 있다 ex) i, j break 분기문 제어문 break는 반복문 안에서 반복을 즉시 끝낼 때 사용한다 continue 분기문 제어문 continue는 반복문의 일부를 건너뛴다 분기문 사용 예