728x90

포인터를 가지고 수행할 수 있는 연산

 

대입하기 : 포인터에 주소를 대입할 수 있다. 예를 들면 대입값은 주소 연산자(&) 뒤에 오는 변수, 즉 배열이름이나 다른                제 2의 포인터가 될 수 있다. 단 그 주소는 포인터형과 일치해야 한다. 무분별한 데이터형 캐스트를 사용하지                않고서는, double형 값의 주소를 int형을 가리키는 포인터에 대입할 수 없다.

 

값 구하기 : *연산자는 그것이 참조하는 주소에 저장되어있는 값을 구한다.

 

포인터 주소 얻기 : 모든 변수들과 마찬가지로, 포인터 변수도 하나의 주소와 값을 가진다. &연산자는 포인터 자체가 어                          디에 저장되어 있는지 알려준다.

 

포인터에 정수 더하기 : 포인터에 정수를 더하거나, 정수에 포인터를 더하기 위해 +연산자를 사용할 수 있다. 어느 경우                                에나, 정수는 포인터가 가리키는 데이터형의 바이트 수만큼 곱해진다. 그러고 나서 결과가 최초                               의 주소에 더해진다. 그 배열의 마지막 원소 바로 다음의 주소(past - the - end)가 유효하다고                                   보장하는 것을 제외하고, 덧셈의 결과가 최초의 포인터가 가리키는 배열의 범위를 벗어나는지는                               정의되지 않는다.

 

포인터 증가시키기 : 배열의 한 원소를 가리키는 포인터를 증가시키면, 그 포인터가 배열의 다음 원소를 가리키게 된다.                            그러므로, ptr1++는 ptr1의 값을 4만큼 증가시킨다.

 

포인터에서 정수 빼기 : 포인터에서 정수를 빼기위해 - 연산자를 사용할 수 있다. 포인터는 첫번째 피연산자이고 정수값                                은 두번째 피연산자가 되어야 한다. 정수는 포인터가 가리키는 데이터형의 바이트 수만큼                                        곱해진다. 그러고 나서 최초의 주소에서 그 결과가 감해진다.

 

포인터 감소시키기 : 포인터를 감소시킬 수도 있다. ptr2를 감소시키면 배열의 세번째 원소가 아니라 두번째 원소를                                   가리키게 된다. 증가연산자와 감소연산자의 전위모드 후위모드 둘다 사용할 수 있다.

 

포인터 사이의 차 구하기 : 두 포인터 사이의 차를 구할 수 있다. 일반적으로, 같은 배열에 있는 원소들이 서로 얼마나                                        떨어져 있는지 알아내기 위해 같은 배열의 두원소를 가리키는 포인터들에 이 연산을                                              수행한다. 그 결과는 데이터형 크기와 같은 단위로 구해진다.                                                                            int형 포인터 urn이 있을 때 &urn[2] - urn은 2이다. 두 포인터 차이가 2바이트가 아니라                                          2개의 int형 크기만큼 떨어져 있는 객체들을 가리킨다는 것을 의미한다.

 

포인터 비교하기 : 두 포인터가 같은 데이터형을 가리키는 경우에, 두 포인터 값을 비교하기 위해 관계연산자를 사용할                         수 있다.

 

뺄셈은 두가지가 있다는 것에 주목하라, 한가지는 포인터에서 다른 포인터를 빼서 정수를 얻는 것이고, 다른 한가지는 포인터에서 정수를 빼서 포인터를 얻는 것이다.

 

C는, 어떤 배열이 주어졌을 때, 배열의 원소를 가리키는 포인터와 마지막 원소 바로 다음의 위치를 가리키는 포인터가 유효한 포인터라고 보장한다. 그러나 마지막 원소 바로 다음 위치를 가리키는 포인터가 유효하다고 보장은 하지만, 그 포인터가 가리키는 내용을 참조할 수 있다고 보장하지는 않는다.

 

포인터를 생성하면 포인터 자체를 저장하기 위한 메모리만 할당된다. 데이터를 저장하기 위한 메모리는 할당되지 않는다. 그러므로 포인터를 사용하기 전에, 반드시 이미할당된 메모리 위치를 그 포인터에 대입해야한다.

 

728x90

'Programming > C' 카테고리의 다른 글

프로그래밍 연습 6  (0) 2019.05.12
C언어 공부 16  (0) 2019.05.11
C언어 공부 14  (0) 2019.05.11
C언어 공부 13  (0) 2019.05.11
프로그래밍 연습 5  (0) 2019.05.09
728x90

배열 : 동일한 하나의 데이터형을 가진 연속된 원소들

 

프로그램이 배열에서 값을 꺼내 오기는 하지만, 배열에 새로운 값을 써 넣지 않을 경우에는 배열을 선언 할 때, const를 사용하는 것이 좋다.

 

배열 원소는 보통의 변수와 같다. 사용자가 이들을 초기화 하지 않는다면 그들은 아무 값이나 가질 수 있다.

 

서로 다른 저장클래스는 서로 다른 특성을 가지고 있다.

 

배열을 사용할 때 초기값 리스트에 들어 있는 항목들의 개수는 배열의 크기와 일치 해야한다.

 

배열을 일부분만 초기화 하면 나머지 원소들이 0으로 설정된다.

 

배열 전체의 크기를 배열 원소 하나의 크로 나누면, 그 배열에 몇개의 원소가 있는지 알 수 있다.

 

지정초기화자를 사용하면 초기화할 원소들을 사용자가 선택할 수 있다.

ex) int arr[6] = {[5] = 212};

사용자가 이 방식으로 최소한 하나의 원소를 초기화 하면, 초기화 하지 않은 나머지 원소들은 0으로 설정된다.

 

하나의 지정초기화자 뒤에, [4] = 31,30,31 와 같이, 여러 개의 값이 붙으면, 여분으로 붙는 값들은 이어지는 다음 원소들을 초기화 하는데 사용된다. 특정 원소가 어떤값으로 한번 이상 초기화 되면, 마지막에 행해진 초기화가 유효하다.

 

배열을 사용할 때, 유효한 범위 내에 있는 배열 인덱스를 사용하고 있는지 반드시 확인해야 한다. 즉, 배열 인덱스의 값이 그 배열에 대해 유효한지 확인 해야한다.

 

배열 인덱스는 0부터 시작한다.

그러므로 배열크기가 사용되는 배열의 선언부와 기타 다른장소에 기호상수를 사용하는 것이다. 이렇게 함으로써 프로그램 전체에 걸쳐서 동일한 배열 크기를 사용할 수 있게 해준다.

 

일반적으로, 3차원 배열은 삼중 중첩루프로 처리하고, 4차원 배열은 사중 중첩 루프로 처리한다. 더높은 차원의 배열도 마찬가지 방식으로 처리한다.

 

컴퓨터의 하드웨어 명령들은 주소를 많이 사용하기 때문에, 포인터를 사용하면 컴퓨터의 표현방식에 가까운 방식으로 표현할 수 있다. 포인터는 배열을 처리하는 매우 효율적인 방법을 제공한다.

 

 

포인터의 값은 그것이 가리키는 객체의 주소이다. 내부적으로 주소를 나타내는 방식은 하드웨어 따라 다르다. 많은 컴퓨터들이 바이트 단위로 주소를 매긴다.

 

포인터에 *연산자를 적용하면, 그 포인터가 가리키는 객체에 저장되어 있는 값을 얻는다.

포인터에 1을 더하면, 그 포인터가 가리키는 객체의 바이트 수 크기 만큼 포인터 값이 증가한다.

 

보통함수에 배열을 알리는 방법은 배열의 시작위치를 나타내기 위해 하나의 포인터 매개변수를 사용하고, 몇개의 원소를 처리할 것인지를 나타내기 위해 하나의 정수 매개변수를 사용한다.

함수에 배열을 알리는 또다른 방법은 두개의 포인터를 전달하는 것이다. 첫번째 포인터는 배열의 시작위치를 나타낸다.

두번째 포인터는 배열이 끝나는 위치를 나타낸다.

 

C는, 배열을 위한 공간을 할당할 때 배열의 끝 바로 다음의 첫번째 위치를 가리키는 포인터가 유효하다는 것을 보장한다.

 

total = *start++;

에서 *와 ++의 우선순위는 같지만 오른쪽에서 왼쪽으로 결합한다. 이것은, ++가 *start에 적용되는것이아니라 start에 적용된다는 것을 의미한다. -> *(start++)

 

배열을 처리하는 함수는 포인터를 전달인자로 사용한다.

 

 

 

 

 

728x90

'Programming > C' 카테고리의 다른 글

C언어 공부 16  (0) 2019.05.11
C언어 공부 15  (0) 2019.05.11
C언어 공부 13  (0) 2019.05.11
프로그래밍 연습 5  (0) 2019.05.09
C언어 공부 12  (0) 2019.05.08
728x90

재귀함수는 return 문에 의해 하나씩 청산된다.

프로그램 흐름이 마지막 재귀 수준의 끝에 도달했을 때, 바로 이전의 재귀 수준으로 제어가 넘어간다. 프로그램은 각각의 재귀 수준을 한단계씩 되짚어 올라가야 한다.

 

재귀 함수에서 재귀호출보다 앞에 있는 문장들은 그 함수들이 호출되는 순서로 실행된다.

재귀함수에서 재귀호출보다 뒤에있는 문장들은 그함수들이 호출되는 순서와 반대의 순서로 실행된다.

->위 특징은 순서를 뒤집을 필요가 있는 프로그래밍 문제를 푸는데 유용하다.

 

재귀의 각 수준이 자신만의 변수를 가질지라도, 코드 자체는 중복되지 않는다.

 

재귀함수는 재귀호출의 시퀀스를 중단시킬 수 있는 무언가를 가지고 있어야 한다.

 

함수를 작성할 때 루프와 재귀를 모두 사용할 수 있다면, 일반적으로 루프가 더 좋은 선택이다.

첫째, 각 재귀호출이 자체의 변수 집합을 가지기 때문에, 재귀가 메모리를 더많이 사용한다. 각 재귀호출은 스텍에 새로운 변수집합을 놓는다. 스택의 공간제한이 재귀호출의 수를 제한할 수 있다. 

둘째, 각 함수호출에 시간이 걸리기 때문에, 재귀는 속도가 늦다.

 

함수 프로토타입과 기호상수 정의를 하나의 헤더파일에 모아놓는것은 좋은 프로그래밍 습관이다.

 

주소연산자 : &

변수이름 앞에 사용했을 때, 그 변수의 주소를 제공한다. &nurse는 변수 nurse의 주소이다.

 

간접연산자 : *

포인터 이름이나 주소 앞에 사용했을 때, 그것이 가리키는 주소에 저장되어있는 값을 가리킨다.

 

함수가 다른 함수에 있는 데이터에 꼭 접근할 필요가 있다면, 포인터를 함수의 전달인자로 사용할 수 있다.

728x90

'Programming > C' 카테고리의 다른 글

C언어 공부 15  (0) 2019.05.11
C언어 공부 14  (0) 2019.05.11
프로그래밍 연습 5  (0) 2019.05.09
C언어 공부 12  (0) 2019.05.08
C언어 공부 11  (0) 2019.05.08
728x90

280p-1
p280-3
p281-6
p282-11
p283-13
p283-14

 

728x90

'Programming > C' 카테고리의 다른 글

C언어 공부 14  (0) 2019.05.11
C언어 공부 13  (0) 2019.05.11
C언어 공부 12  (0) 2019.05.08
C언어 공부 11  (0) 2019.05.08
C언어 공부 10  (0) 2019.05.08
728x90

함수는 하나의 특정 작업을 수행하도록 독립적으로 설계된 프로그램 코드의 한 단위이다.

 

함수도 데이터 형을 가지며 함수를 사용하기전에 함수의 데이터형을 미리 선언해야한다.

void형은 함수가 값을 리턴하지 않는다는 것이다.

 

일반적으로 프로토 타입은 함수반환값의 형과 예상되는 전달인자의 형을 모두 명시한다.

 

프로토타입은 전달인자의 개수와 데이터형을 표시하기 위해 콤마로 분리된 데이터형 리스트를 사용한다.

 

프로토타입에 변수이름을 사용한다고 해서 실제로 변수가 생성되는 것은 아니다.

 

실전달인자는 형식 매개변수로 알려지는 변수에 대입되는 특정한 값이다.

 

피호출 함수(called function)는 호출함수(calling function)로 부터 복사된 데이터를 가지고 작업하기 때문에, 피호출 함수가 사본데이터에 어떠한 조작을 가하더라도, 호출 함수에 있는 원래의 데이터는 보호된다.

 

호출함수는 전달인자를 스택(stack)이라는 임시 저장 공간에 놓는다. 피호출 함수는 그 스택으로부터 전달인자를 읽는다.

 

float형은 전달인자로 전달될때 double형으로 올림 변환이 일어난다.

 

데이터형이 프로토타입과 일치하지 않는다면, 컴파일러는 캐스트 연산을 적용하여 실전달인자들의 값을 형식 매개변수와 일치하는 데이터형으로 변환한다.

 

에러는 컴파일을 중단하지만 경고는 컴파일을 허용한다는 것이다.

 

printf()의 부분적인 프로토타입

int printf(const char *,...);

이 프로토타입은, 첫번째 전달인자가 문자열이라는 것과, 지정되지 않은 전달인자가 더 있을 수 도 있다는 것을 말해준다.

 

C라이브러리는, stdarg.h 헤더파일을 통해 매개변수의 개수가 가변적인 함수를 정의하는 표준 방법을 제공한다. C는 함수가 자기자신을 호출하는 것을 허용한다. 이과정을 재귀(recursion)라고 부른다. 재귀를 끝내는 조건검사를 프로그램에 포함시키지 않는다면, 자기자신을 호출하는 함수는 무한정 그렇게 하려는 경향이 있기 때문에 재귀를 끝내는 부분이 까다롭다.

 

728x90

'Programming > C' 카테고리의 다른 글

C언어 공부 13  (0) 2019.05.11
프로그래밍 연습 5  (0) 2019.05.09
C언어 공부 11  (0) 2019.05.08
C언어 공부 10  (0) 2019.05.08
C언어 공부 9  (0) 2019.05.08
728x90

C프로그램은 파일을 직접 다루지 않고 스트림(stream)을 다룬다. 스트림은 실제의 입력이나 출력이 맵핑된(mapped) 데이터의 이상화된 흐름이다.

서로다른 특성을 가진 여러 종류의 입력들이, 좀더 일관된 특성을 가진 스트림으로 표현된다는 것을 의미한다.

그렇게 되면, 파일을 여는 과정은 하나의 스트림을 그파일에 연결하는 과정이 된다. 읽기와 쓰기도 스트림을 통해 이루어진다.

 

컴퓨터의 운영체제는 각각의 파일이 어디에서 시작하고 어디에서 끝나는지 말해주는 어떤 방법이 필요하다. 파일의 끝을 탐지하는 한가지 방법은, 끝을 표시하는 특별한 문자를 파일안에 집어 넣는것이다.

 

C는 운영체제가 어떻게 파일끝을 실제로 탐지 하느냐에 관계없이, 파일의 끝에 도달했을 때 getchar()함수가 특별한 값을 리턴하게 함으로써 이 다양한 방법들을 처리한다. 이 특별한 값의 이름이 EOF(end of file)이다. 일반적으로 EOF는 stdio.h 파일에 다음과 같이 정의되어 있다.

#define EOF (-1)

 

입력과 출력은 함수, 데이터, 장치들과 관계를 맺는다.

 

프로그램이 파일을 다루는 방법은 두가지가 있다. 첫번째 방법은 파일을 열고, 파일을 닫고, 파일을 읽고, 파일에 쓰는 등의 작업을 할 수 있는 특별한 함수들을 명시적으로 사용하는 것이다.

두번쨰 방법은 키보드와 화면을 처리하도록 설계된 프로그램을 사용하되, 다른 채널을 사용하도록 입력과 출력을(예를 들면 파일로 부터 또는 파일로) 리디렉션 하는 것이다.

>>연산자는 이미 존재하는 파일의 끝에 데이터를 추가한다. pipe(|)는 한 프로그램의 출력을 두번째 프로그램의 입력으로 연결시킨다.

 

getchar()가 스페이스, 탭, 개행을 포함한 모든 문자를 읽는 반면에, scanf()는 수를 읽을 때 스페이스, 탭, 개행문자를 건너 뛰기 때문이다.

 

scanf()함수는 개행문자를 입력큐에 남겨둔다. scanf()함수는 성공적으로 읽은 항목의 수를 리턴한다.

 

C프로그램은 입력을, 들어오는 바이트들의 스트림으로 인식한다. getchar()함수는 각 바이트를 문자코드로 해석한다. scanf() 하무도 동일한 방식으로 입력을 인식하지만, 변환 지정자의 안내를 받아 문자입력을 수치값으로 변환할 수 있다.

728x90

'Programming > C' 카테고리의 다른 글

프로그래밍 연습 5  (0) 2019.05.09
C언어 공부 12  (0) 2019.05.08
C언어 공부 10  (0) 2019.05.08
C언어 공부 9  (0) 2019.05.08
프로그래밍연습 4  (0) 2019.05.06
728x90

continue 문을 만나면, 프로그램은 해당 루프 사이클의 나머지를 건너뛰고, 다음 루프사이클을 시작한다.

continue 문이 중첩된 구조 속에 들어있는 경우에는, 그 continue문을 포함하고 있는 내부 구조만 영향을 받는다.

 

break 문은, break가 들어 있는 그 루프로 부터 프로그램을 탈출시킨다. break문은 루프 바로 다음에 오는 문장을 곧장 실행을 옮긴다.

 

switch에서 break문은 switch다음에 오는 문장으로 건너 뛰게 만든다.

 

문자 입출력

입력 문자들을 즉시 에코 하는 것은 버퍼를 사용하지 않는 입력 또는 직접 입력의 한 사례이다. 반면에 입력 문자들을 뒤늦게 몰아서 에코하는 것은 버퍼(buffer)를 사용하는 입력의 한 사례이다.

 

버퍼를 사용하는 이유

1.문자들을 묶어서 전달하는 것이 하나씩 전달하는 것보다 시간을 적게 소모한다.

2. 잘못 타이핑 했을 때 키보드 기능을 사용하여 실수를 고칠 수 있다.

 

버퍼를 사용하지 않는 입력은 일부 대화식 프로그램에서 필요하다.

-> 게임에서 각 명령은 키를 누르는 즉시 실행 되어야 한다.

그러므로 버퍼를 사용하는 입력과 버퍼를 사용하지 않는 입력은 각각의 용도가 따로있다.

 

완전 버퍼링 입출력 : 가득 찼을때 버퍼가 비워진다. 일반적으로 파일입력에서 일어난다. 버퍼 크기는 시스템에 따라 다르지만, 512바이트와 4096바이트가 일반적인 값이다.

 

라인-버퍼링 입출력 : 개행 문자가 나타날 때마다 버퍼가 비워진다. 일반적으로 키보드 입력은 라인 버퍼링 입력이다.

 

 

IBM PC 호환기종의 PC는 C컴파일러들이 버퍼를 사용하지 않는 입력을 위해, conio.h 헤더파일이 지원하는 특별한 함수들의 계열을 제공한다. 여기에는 버퍼를 사용하지 않는 에코하는 입력을 위한 getche()와, 버퍼를 사용하지 않는 에코하지 않는 입력을 위한 getch()가 포함되어 있다.

 

에코하는 입력 : 사용자가 타이핑하는 문자가 화면에 보이는것

에코하지 않는 입력 : 키스트로크가 화면에 보이지 않는것

 

버퍼링에 대한 약간의 제어를 제공하는 함수 : setbuf(), setvbuf()

 

컴퓨터시스템들은 파일들을 저장하는 방식이 저마다 다르다. 어떤 시스템은 파일의 내용은 한곳에 저장하고, 그 파일에 대한 정보는 다른 곳에 저장한다.

어떤 시스템은 파일에 대한 정보를 그 파일 안에 저장한다.

 

텍스트를 다룰때, 어떤 시스템은 하나의 개행문자로 라인의 끝을 표시한다.

그런데 어떤 시스템은 캐리지 리턴 문자와 라인피드 문자의 조합으로 라인의 끝을 표기한다. 어떤 시스템은 파일의 크기를 정확한 바이트값으로 나타내지만, 어떤 시스템은 바이트들의 블록으로 나타낸다.

728x90

'Programming > C' 카테고리의 다른 글

C언어 공부 12  (0) 2019.05.08
C언어 공부 11  (0) 2019.05.08
C언어 공부 9  (0) 2019.05.08
프로그래밍연습 4  (0) 2019.05.06
프로그래밍 연습 3  (0) 2019.05.06
728x90

if와 else 사이에 하나 이상의 문장을 넣으려면, 단일블록을 만들기 위해 중괄호를 사용해야 한다.

ex)

if( x> 0)

{

   printf("x를 증가시킨다. : \n");

    x++

}

else

    printf("x <=0 \n");

 

getchar() : 단일 문자 입력함수

putchar() : 단일 문자 출력함수

 

getchar()와 putchar()는 scanf()와 printf()보다 빠르고 간결하다.

 

isalpha() : 전달인자가 알파벳 문자이면 0이아닌 값을 리턴한다.

 

tolower(ch);             //ch값 자체에 영향을 주지않는다.

ch = tolower(ch);       //ch를 소문자로 변환한다.

 

ctype.h 계열의 문자검사 함수들

isalnum() : 알파뉴메릭 문자(알파벳이나 숫자)

isalpha() : 알파벳

isblank() : 표준 블랭크 문자(스페이스, 수평탭, 개행)

isctrl() : ctrl+B와 같은, 제어문자

isdigit() : 숫자

isgraph() : 스페이스가 아닌 출력 가능한 문자

islower() : 영어 소문자

isprint() : 출력 가능한 문자

ispunct() : 구두점 문자(스페이스 또는 알파뉴메릭 문자가 아닌 출력가능)

isspace() : 화이트 스페이스 문자(스페이스, 개행, 폼피드, 캐리지리턴, 수직 탭, 기타 로케일 문자)

isupper() : 영어 대문자

isxdigit() : 16진수 숫자

 

ctype.h : 문자 매핑 함수들

tolower() : 전달인자가 대문자이면 소문자로 변환한 버전을 리턴한다. 전달인자가 소문자이면 원래의 전달인자를 그대로 리턴한다.

toupper() : 전달인자가 소문자이면 대문자로 변환한 버전을 리턴한다. 전달인자가 대문자이면 원래의 전달인자를 그대로 리턴한다.

 

정수곱 계산이 제곱근 계산보다 훨씬 빠르다

 

논리연산자                                       의미

&&                                         논리곱 AND

||                                             논리합 OR

!                                              논리부정 NOT

 

iso646.h 헤더파일을 사용하면

&&   대신   and

||      대신     or

!       대신      not

사용이 가능하다

 

범위를 검사하는데 && 연산자를 사용할 수 있다.

if(range >= 90 && range <= 100 )

if(90 <= range <= 100)           //이렇게 하지 마라

-> 에러를 찾아내지 못한다. if((90<= range) <= 100) ->이 된다. -> range가 90보다 크다면 -> if(1<=100)으로 항상 참이된다.

 

bool, true, false 를 쓰기 위해선 stdbool.h 헤더파일을 사용해야 한다.

 

문자열 입력에서 \n이나 ' '(스페이스)등을 필터링할때 ctype.h계열의 isspace()함수를 사용하는 것이 더 간단하다.

 

피연산자가 하나인 연산자를 단항연산자, 피연산자가 두개인 연산자를 이항 연산자라고 한다.

 

 

728x90

'Programming > C' 카테고리의 다른 글

C언어 공부 11  (0) 2019.05.08
C언어 공부 10  (0) 2019.05.08
프로그래밍연습 4  (0) 2019.05.06
프로그래밍 연습 3  (0) 2019.05.06
C언어 공부 8  (0) 2019.05.06

+ Recent posts