○ 음수표현
: 음수의 표현은 MBS만 1로 설정하면 되는것이 아니라, 1의 보수를 취하고 1을 더해 표현한다.

○ 상수
: 변경 불가능한 데이터로 상수의 자료형은 상수에 맞게 자료형이 결정된다.

○ 자동 형변환
- 정수의 승격 : 연산의 효율성을 위해 적절한 자료형으로 형 변환을 거친 다음 연산을 진행하는것
- 산술 연산의 형변환 : 데이터의 손실이 최소화되는 방향으로 진행된다.(char->int->long->float->double->long double)
- 명시적형변환 : 산술 연산결과의 자료형은 피 연산자의 자료형과 일치하기 때문에 데이터 손실을 막기위해 명시적으로 선언

○ print문
: 캐리지 리턴(Carriage Return) 은 현재 위치를 나타내는 커서 를 맨 앞으로 이동시킨다는 뜻이고, 라인피드 (Line Feed) 는 커서의 위치를 아랫줄로 이동시킨다는 뜻이다. 즉,  윈도우에서는 이 두 동작을 합처 Enter 동작을 하는것. CR+LF(Carriage Return + Line Feed)

○ scanf문
: scanf 함수는 공백(스페이스, tab, enter키 입력)을 기준으로 데이터의 수를 결정짓는다. 

○  switch ~ case
: Switch문에 전달되는 인자값은 int형 혹은 char형 정수가 되어야 한다.

○ 반복문
- break문 : 반복문을 탈출할 때 사용하는 키워드로 break문을 만나면 break문을 가장 가까이서 감싸고 있는 반복문 하나를 빠져나온다.
- continue문 : 돌던 루프의 남아 있는 부분을 그냥 건너뛴다.

○ 함수
- 함수의 원형선언 : 컴파일러에게 함수의 존재를 미리 알려주기위해 미리 선언하는것.
- 함수의 정의 : 기능을 가진 함수를 하나 만드는것. 함수의 이름을 정하고, 기능을 구현하고, 전달 인자와 반환 값의 형태를 결정짓는 것.
- 함수의 호출 : 해당 함수로 인자값을 넘겨 실행 시키는 것.

○ 전역변수
- 지역변수는 초기화 하지 않으면 쓰레기값이 되지만, 전역변수는 초기화 하지 않으면 0 이다.
- 전역변수는 메모리 공간을 할당받고 초기화가 이루어지면, 프로그램이 종료될 때까지 소멸되지도 않고 초기화도 다시 일어나지 않는다.

○  배열
- 문자열의 끝에는 그 문자열의 끝을 의미하는 'null'문자 라는 것이 자동적으로 삽입된다.

○ 포인터
- 포인터 변수 앞에 * 연산자가 붙으면, 포인터가 가리키는 메모리 공간에 존재하는 값을 참조하라는 뜻이다.
- 포인터에 의한 참조값의 증감 연산은 *연산자보다 ++연산자가 우선순위가 높기 때문에 괄호를 반드시 해야한다. (*pA)++;
- 포인터의 타입은 메모리를 참조하는 방법을 알려주는 역할을 한다.

○ 배열과 포인터
- 배열의 이름은 첫번째 요소의 주소값을 나타낸다. 즉 배열의 이름은 변경이 불가능한 상수 포인터 이다.
- 포인터 변수는 다양한 주소를 가리킬 수 있지만, 배열의 이름은 상수로 평생 선언한 배열의 첫번째 요소만을 가리킨다.
- 포인터를 배열의 이름처럼 사용할 수 있고, 배열의 이름 또한 포인터처럼 사용하는 것이 가능하다. ( arr[i] == *(arr+i) )
- 포인터 변수를 0으로 초기화 하는 것은 메모리 0번지를 가리키는 것이 아니라 아무것도 가리키지 않는 NULL 포인터 이다.
- 포인터 변수 *pt의 *(++pt)는 포인터 값을 증가하는 연산이고, *(pt+2)는 포인터 값은 변화하지 않고 +2번째의 값을 참조하라는 것이다.
- char *str = "ABCD"와 같은 문자열 상수는 메모리 공간에 저장이 되면, 그 순간 문자열 상수의 주소 값이 반환된다.
- 포인터 배열은 포인터변수로 이루어진 배열이다.

○ 포인터와 함수
- 배열을 함수의 인자로 전달하면 포인터로 받아 이를 통해 배열의 값을 참조 할 수있다.
- 배열의 이름에 sizeof 연산자를 사용하면 배열의 전체 크기가 바이트 단위로 반환되고, 포인트 변수는 4가 반환된다.
- 배열로 전달된 함수의 인자를 배열로 받을 수 있다. (int pArr[] == int *pArr) 함수의 매개변수를 선언할때만 가능하다.
- 함수호출 방식의 call by value는 값이 새로 복사되고, call by reference는 함수 호출시 주소를 전달해서 변수의 조작을 가능하다.
- const int* p = &a 는 포인터p를 통해서 변수 a의 값을 변경하는 것만 막는 것이다. 변수 a의 조작에는 문제되지 않는다.
- int* const p = &a 는 포인터를 상수화하여 p가 지니는 주소 값을 변경할수 없다.

○ 다차원 배열
- int arr[3][4]의 의미는 '길이가 4인 int형 배열을 3개 모아놓은 배열을 생성하라'이다.
- 2차원 배열에서 선언과 동시에 초기화 하는 경우, 첫 번째 인덱스만 생략 가능하다. (int arr[][2] = {1,2,3,4,5,6})

○ 포인터의 포인터
- 더블 포인터는 싱글 포인터의 주소 값을 저장하기 위한 용도로 사용되는 포인터 이다.
- 포인터를 이용한 swap()함수 구현은 더블 포인터를 이용해야한다. 싱글포인터를 이용할 경우 값의 복사가 일어나 적용되지 않는다.
- 포인터 배열에서 배열의 이름은 더블 포인터이다.

○ 다차원 배열과 포인터
- 2차원 배열의 이름은 포인터 연산 시 행 단위로 이동한다. (a -> a[0][0] 이면 a+1 -> a[1][0])
- 2차원배열은 int arr[2][4] == int (*pArr)[4] 이고 포인터 연산에 의해 1 증가 및 감소될 경우 4칸씩 이동하는 배열 포인퍼 이다.
- pArr은 int arr[2][4] 또는 int arr[3][4]와 같은 배열을 가리킬 수 있는 배열 포인터 이다.

○ 함수 포인터와 void형 포인터
- 함수포인터의 이름은 메모리상에 존재하는 함수의 위치를 가리키는 포인터 이다. (배열의 이름과 마찬가지로 상수 포인터이다)
- int (*func)(int)의 의미는 반환형 int, int형 인자값 1개를 가진 함수를 func이라는 함수 포인터로 가리키기 위한 함수 포인터 선언이다.
- void형 포인터는 변수의 타입에 상관없이 주소를 가리킬 수 있다. 하지만 주소 값을 저장하는 것 이외에 아무것도 할 수 없다.
- main() 함수 또한 argc와 argv를 이용해 인자를 전달 받을 수 있다. ( int main(int argc, char* argv[]) )

○ 문자와 문자열 처리 함수
- EOF는 파일의 끝을 알리기위한 값으로 실제 값은 -1이다.
- fgetc()호출시 파일의 끝에 도달하면 EOF를 반환하고, getchar()의 경우는 Ctrl-Z키를 파일의 끝으로 정의한다.

○ 구조체
- 구조체 역시 함수 호출시 구조체의 주소값을 넘겨 구조체 변수의 값을 조작할 수 있다.
- 구조체 변수의 초기화 대상에 함수 호출 문장이 있을경우 함수 리턴값으로 초기화 된다.



by 민트앤라떼 2012. 7. 2. 09:59