c언어 PPT 보고서
1 포인터
1. 포인터의 정의와 선언 방법
사전 정의 포인터(pointer)는 프로그래밍 언어에서 다른 변수, 혹은 그 변수의 메모리 공간주소를 가리키는 변수를 말한다.
포인터는 ***메모리 주소 값을 저장하기 위한 변수***를 말한다.
포인터는 ex) int *a; 이런 꼴로 선언하는 데
값을 받아줄때는
ex) int a = 100;
int *point = &a;
이런꼴로 받아준다 ***여기서 a앞에 &를 붙여주는 이유는
a의 주소값을 받기 때문이다***
(이렇게 활용한다)
포인터의 연산(전'후위 연산자)은 자료형에 따라 증가량이 다르다.
ex1)
이렇게 말이다.
포인터의 사칙연산은
ex2)
이렇게 할수있다.
2.포인터와 배열
배열과 포인터는 활용이 굉장히 비슷하다
배열과 포인터 둘다 주솟값을 위주로 다루는데
배열은 맨앞에있는 수 또는 문자가 주솟값을 상징한다
그래서 배열 이름을 포인터 처럼, 포인터를 배열 이름처럼
활용하는 것이 가능하다!!!
바로 이렇게 말이다.
그리고 이걸 합친 포인터 배열이라는 것이 존재 하는데
포인터 배열>>***(배열의 요소로 포인터를 지니는 배열)***
이렇게 활용이 가능하다!
3. 포인터가 필요한 이유
먼저 어려운 말로 하자면,
1.메모리 주소를 참조해서 다양한 자료형 변수들의 접근과 조작 용이
2. 메모리 주소를 참조하여 배열과 같은 연속된 데이터에 접근과 조작 용이
3. 동적 할당된 메모리 영역(힙영역)에 접근과 조작 용이
동적할당>> 동적 할당은 컴퓨터 프로그래밍에서 실행 시간 동안
사용할 메모리 공간을 할당하는 것을 말한다.
한마디로 ***값에 접근할때 유리하기 때문에 사용한다***
2. 함수와 포인터
1.함수란? >>먼저 함수란,
간단히 말하자면 특정기능을 더욱 간결하고, 편리하게 사용하기 위하여 쓰는 일종의 도구라고, 볼수있다. 쉽게 말하자면, 함수는 특정한 기능을 따로 분리해놓은 것으로 수학에서 말하는 함수와 거의 동일한 기능을 수행한다.{X를 넣으면 Y과 출력되는 것(여기서 X는 사용자에게 입력받은 수를 말한다)}
2.함수와 포인터가 함께 사용
포인터는 swap을 할때 대표적으로 사용할수있다!
SWAP함수 구현↓↓↓
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include <stdio.h> void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } int main(void) { int i = 300; int j = 500; int* i1 = &i; // i의 주소(&i)를, 포인터 변수 i1 에 대입 int* j1 = &j; // j의 주소(&j)를, 포인터 변수 j1 에 대입 printf("i = %d\n", i);// i = 300 printf("j = %d\n", j);// j = 500 swap(i1, j1); printf("i = %d\n", i);// i = 500 printf("j = %d\n", j);// j = 300 return 0; } | cs |
이렇게 하면 결과가 밑처럼 나온다
1,2번쨰는 안바뀌지만 3,4번째에는 이미 설정해 놓은 포인터를 이용한 swap함수를 이용하면서 수가 바뀌어져서 나온다
3. 재귀함수
재귀함수는 말그대로 함수내에서 또 자기를 부르는 것이다.
재귀함수 구현↓↓↓
위 예제는 재귀함수중에 가장 유명한 팩토리얼이다.
*(팩토리얼 >> 5!= 5 x 4 x 3 x 2 x 1 = 120)*
위 예제를 볼수있듯이 재귀함수는 함수내에서 함수를 다시 호출해서 계속 조건에 맞지 않을 때까지 반복을
하는 거라고 볼 수있다.
4. 함수가 사용되는 이유
1. 반복을 피한다
함수를 사용한다면 반복을 피할수 있다는 장점이 있다.
왜냐하면 만약 홀수인지 짝수인지 구별하는 프로그램을
짠다고 했을 때 함수를 사용하지 않는 다면 메인부분 에
if문이 총 3행이 나올것이다.
하지만 함수를 사용한다면 메인 부분이 printf 3줄이면 끝이 난다
2. 가독성이 높다
이것은 위에 이유 덕분이다. 같은 문을 반복하고자 할때
이미 짜여진 함수만
인용해서 쓰면 되므로 코드가 굉장히 간단해진다.
3. 다차원 배열
1. 다차원 배열 정의 및 구현
정의 == 2차원 이상의 배열을 의미한다
다차원 배열의 선언↓
2차원 배열 형태 >> int arr[10][10]
↑ ↑
{행} {열}
2차원 배열의 선언, 초기화 & 활용
이렇게 선언과 동시에 초기화를 할수있다
***한마디로***
1차원 배열은 >> 선
2차원 배열은 >> 면
3차원 배열은 >> 직육면체 라고 볼수있다.
***
3차원 배열이상은 구조적인 이해가 불가하다.
(4차원의 형태가 되기떄문에)
4. 포인터의 포인터
1. 포인터의 정의 및 활용 방법
포인터의 포인터 = 더블 포인터
***싱글 포인터의 주소값을 저장하는 용도의 포인터!!!
활용
double *ptr1 = &val; // 싱글 포인터
double **ptr2 = &ptr1; // 더블 포인터
***싱글 포인터는 일반 변수의 주소를 저장하고
더블 포인터는 싱글포인터의 주소를 저장하는
것이라고 볼수있다!!!***
활용 ↓↓
5. 다차원 배열 그리고 포인터
2차원 배열에서는 1차원 배열과는 다르게 가르키는 요소의 자료형이 같다고해도
포인터 연산 시 증가하는 값의 크기 불일치
>> 따라서 포인터의 연산 결과도 생각해 봐야 함.
예를 들어
int a[3][2] = {1, 2, 3, 4, 5, 6};
라고 하면 1 2
3 4
5 6
이렇게 짜여 지는데,
그래서 a[0] = 1 2, a[1] = 3 4, a[2] = 5 6
이렇게 들어간다.
또한 a[1] = a + 1, a[2] = a + 2 로
나타낼 수 있는데,
만약 int a[3][2] = {"1, 2, 3, 4, 5, 6"}; 라고 한다면
각각 a + @가 배열의 값을 가르킨다.
6. 문자와 문자열 처리함수
1. 표준 입, 출력 스트림
종류
stdin == 표준 입력 스트림
stdout == 표준 출력 스트림
stderr == 표준 에러 스트림
이것들을 설명하기 위해서는 버퍼라는 개념이 필요한데,
버퍼란? 일시적으로 데이터를 담아 놓는 메모리의 일종이다.
***{성능 향상이 목적이다}***
이 개념을 이용해서 설명하자면, stdin은 표준입력버퍼, stdout은 표준 출력 버퍼,
stderr은 표준 에러 출력버퍼 이다..
한마디로 stdin은 입력받은 값을 잠시 담아두는 메모리고
stdout은 출력할 값들을 잠시 담아두는 메모리라고 볼수있다.
따라서 stdin은 키보드, stdout, stderr는 모니터와 연결되어있다!!
활용↓↓↓
그냥 안썻을 때와 육안으로는 같다...
사용하는 이유 >>대표적으로 stderr을 들자면출력이 복잡할때 printf를 쓸경우 버퍼문제로 제대로 출력이 되지않을 경우가 있다.이렇게 될경우 에러 메시지 출력을
잘 못하게되는 경우가있는데 stderr을 사용한다면 버퍼없이 바로 출력하기 때문에 어떤상황이 와도
가장 빠르게 에러 메시지를 출력할 수 있기
때문이다.
***fscanf() 함수는 오류가 발생하거나 파일의 끝에
도달하면, EOF를 돌려준다.
*EOF = End-Of-File의 약자로 파일의 끝을 표현하기
위한 상수(-1의 값을 지닌다)*
fprintf() 함수는 오류가 발생하면 음수값을 반환한다.***
2. 문자 단위 입,출력 함수의 필요성
***용도에 맞는 적절한 함수를
제공함으로서 성능 향상을 도모***
3. 문자열 입, 출력함수
문자열 출력 함수 >> puts
문자열 입력 함수 >> gets
이렇게 둘이 있다.
활용↓↓
4. 버퍼를 비우는 작업을 하는 fflush함수
fflush는 출력 버퍼를 비우는 작업을 한다.
활용 ↓↓
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <stdio.h> int main(void) { char perID[7]; // 6+null문자=7 char name[10]; fputs("주민번호 앞 6 자리를 입력하세요 : ", stdout); fgets(perID, sizeof(perID), stdin); fflush(stdin); // 입력 버퍼를 비운다. fputs("이름을 입력 하세요 : ", stdout); fgets(name, sizeof(name), stdin); printf("주민번호 앞자리 : %s\n", perID); printf("이 름 : %s\n", name); return 0; } | cs |
예제로는 이런것이 있는데,
VS(2015)에서는 통하지 않는다.(fflush(stdin)이 올바르지 않은 사용법이기 때문)
그래서 fflush(stdin)을 while(getchar() != '\n')으로
바꿔주는 것이 좋다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <stdio.h> int main(void) { char perID[7]; // 6+null문자=7 char name[10]; fputs("주민번호 앞 6 자리를 입력하세요 : ", stdout); fgets(perID, sizeof(perID), stdin); while(getchar() != '\n'); // 입력 버퍼를 비운다. fputs("이름을 입력 하세요 : ", stdout); fgets(name, sizeof(name), stdin); printf("주민번호 앞자리 : %s\n", perID); printf("이 름 : %s\n", name); return 0; } | cs |
이렇게 말이다!!
5. 문자열 조작 함수
1.종류 >> 문자열의 길이를 반환하는>strlen
문자열을 추가하는>strcat
문자열을 비교하는>strcmp
문자열을 복사하는>strcpy
***헤더 파일로 <string.h>를 꼭 추가 시켜줘야한다.***
각 함수 구현 ↓↓↓
***이것을 for문으로 바꾸는게 궁금하다면
제 블로그중 이것과 관련된 글을 보세요!***
6. 문자열을 숫자로 변환
& 대문자↔소문자
atoi에 대해서 알아보자
바로 예제로 들어가서 설명해보자!
다음은 tolower, toupper에 대해서 알아보자!!
***ctype.h를꼭 추가 시켜줘야한다.***
toupper은 소문자를 대문자로,
tolower은 대문자를 소문자로 만들어준다.
신기 하다!
***putchar말고 printf써도 바뀐다.***
7. 구조체와 사용자정의 자료형
1. 구조체의 정의와 활용
구조체란? >> 하나 이상의 기본 자료형을 기반으로 사용자 정의
자료형을 만들 수 있는 문법 요소
구조체변수를 선언하는 법
case 1 : struct point {
int a;
double b;
}p1, p2, p3;
case 2: struct point{
int a;
double b;
};
int main(void){
struct point p1, p2, p3;
......
return 0;
}
>>>>>>>>>>>구조체 변수의 접근!<<<<<<<<<<<
2. 구조체와 배열 그리고 포인터
포인터를 이용해서 구조체(배열)를 다룰수있다.
예제↓↓↓
3. 구조체의 유용함(장점)
1. 잘 구현된 프로그램은 처리되어야 할 데이터의 부류가 적절히
나뉘어 진다.
2. 부류를 적절히 나누면 데이터를 처리하는 과정이 수월해진다.
4. 중첩된 구조체
정의 >> 구조체의 멤버로 구조체 변수가 오는 경우
1. 구조체변수의 초기화 방식!!
***struct point{
int x;
int y;};***
struct circle{
struct point p;
double radius;
};
int main(){
case 1: struct circle c={1, 2, 3.0}
case 2: struct circle c={{1, 2}, 3.0}
}
예제↓↓↓
5. typedef의 이해
typedef는 TYPE DEFINE의 약자로 해석하면 "형식을 정의 해라"라는 뜻을 가지고 있다
한 마디로 char, int등의 자료형을 내맘대로 지정 할수 있다는 것이다.
(***VS에서는 한글이 지원된다!!!***)
예제↓↓↓
6. 공용체
(이것은 그림으로 봐야지 가장 큰이해가 된다.)
(사용방법 >> 구조체와 동일하나 union을 사용한다)
이것을 한 마디로 말한다면
하나의 메모리 공간을 둘 이상의 변수가 공유하는 형태라고 말할수 있다.
7. 열거형
열거형의 선언 방법 및 열거형의 특성
선언방법
ex) enum num{a = 1, b = 3, c = 5}; //num이라는 이름을 가진 열거형의 자료형 생성
열거형 변수를 생성
ex) enum num c;
특성 >> 1. 열거형 자료형의 안에 있는 자료들은 상수로 결정되며,
열거형이 생성됨과 동시에 안의 자료들은 다 상수로 생성된다
2. 열거형 안에 상수들을 초기화하지 않으면 각각의 값에 0, 1, 2.....?이렇게 0부터 1씩 증가한다.
열거형을 사용하는 이유 >>
1. 특정 정수 값에 의미를 부여할수있다
2. 따라서 프로그램의 가독성을 높여주는데 기여를 한다.
예제↓↓↓(초기화 하지않으면 0부터 커지는 원리이용)
끝~~
'IT전공관련' 카테고리의 다른 글
Layer 7 개인 프로젝트 보고서 (0) | 2017.05.21 |
---|---|
개인 프로젝트 (0) | 2017.05.17 |
코드업 함수 문제 (0) | 2017.04.12 |
swap함수 구현하기 (0) | 2017.04.06 |
포인터 보고서 (0) | 2017.04.06 |