열거형
열거형의 멤버는 차례대로 0의 값을 갖는다. 하지만 선언할 때 초기값을 원하는 값으로 설정할 수도 있다.
#include <stdio.h> enum season { spring = 1, summer, fall, winter }Season; void main(void) { printf("계절을 고르세요 -> \n 1.봄 2.여름 3.가을 4.겨울 : "); scanf("%i" , &Season); switch (Season) { case spring: printf("봄은 꽃 피는 계절\n"); break; case summer: printf("여름은 바캉스의 계절\n"); break; case fall: printf("가을은 낙엽이 밟히는 계절\n"); break; case winter: printf("겨울은 눈 내리는 계절\n"); break; default: break; } }
auto 키워드
원래 C에서의 의미와 C++에서의 의미
https://dojang.io/mod/page/view.php?id=803
c에서도 다음과 같이 선언하고 실행 결과를 얻을 수 있다. (http://codepad.org/kzaEWQRj)
#include <stdio.h>
auto func() {
return 10;
}
void main() {
int a;
a = func();
printf("%d \n", a);
}
|
Output:
10 |
구조체 변수를 함수 매개변수에 사용하기
구조체 변수는 대입 연산이 가능하므로 함수의 매개변수로 주거나 반환받을 수 있다.
예를 들어, 함수에서 여러 개의 값을 구조체로 묶어 동시에 반환할 수 있다.
두 변수의 값을 바꾸는 함수는 포인터가 필요하지만, 구조체 변수를 사용해 값을 주고 받으면
포인터 없이도 두 변수의 값을 바꾸는 함수를 만들 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #include <stdio.h> typedef struct { double left; double right; } vision; vision exchange(vision); // 구조체를 통해 두 변수의 값을 교환 int main(void) { vision robot; printf("시력 입력 : "); scanf_s("%lf %lf", &(robot.left), &(robot.right)); robot = exchange(robot); printf("바뀐 시력 : %.1lf, %.1lf \n", robot.left, robot.right); return 0; } vision exchange(vision robot) { double temp; temp = robot.left; robot.left = robot.right; robot.right = temp; return robot; }; | cs |
Output :
시력 입력 : 0.5 1.5
바뀐 시력 : 1.5, 0.5
비트 필드 구조체
1 2 3 4 5 6 | struct children { unsigned int son : 2; unsigned int daughter : 2; unsigned int pet : 3; }; | cs |
비트 필드 구조체를 이용하면, 멤버의 크기를 비트 단위로 설정할 수 있다. colon(:) 뒤의 숫자가 멤버가 사용하는 비트 수 이다.
저장할 수 있는 값의 범위는 비트 수에 따라 2의 n승. (2비트는 0~3, 3비트는 0~7)
signed를 이용하면 음수도 저장할 수 있으나, 부호비트 처리방식이 시스템에 따라 다를 수 있으므로 unsigned를 주로 사용
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <stdio.h> typedef struct { unsigned int son : 4; unsigned int daughter : 4; } children; int main(void) { children child = { 1, 2 }; // 구조체 변수 초기화 int sum; printf("children 구조체 크기 : %d 바이트 \n", sizeof(child) ); sum = child.son + child.daughter; printf("자식 수 : %d \n", sum); } | cs |
Output :
children 구조체 크기 : 4 바이트
자식 수 : 3
자료형은 정수형만 사용하며, 멤버가 가질 수 있는 최대 비트 수를 결정
unsigned int형은 최대 32비트까지만 지정 가능.
위에서 children 구조체 멤버의 비트 수를 모두 합해도 7비트지만, unsigned int형 크기인 32비트가 메모리에 할당된다.
(멤버가 할당되지 않은 영역은 사용하지 않는 영역이 됨)
만약 기본 할당된 영역을 넘어서면 새로운 바이트 공간을 사용하면서 멤버가 할당되게 된다.
패딩 비트 (사용하지 않는 공간)
만약, 멤버의 이름을 생략하면 사용하지 않는 패딩 비트가 된다.
|
|
b |
b |
b |
패딩 |
비트 |
a |
|
|
|
|
c |
c |
c |
c |
배열을 멤버로 선언하거나 멤버의 주소를 직접 구할 순 없다.
키보드로 입력을 받아들이려면 별도의 변수에 입력한 후에 멤버에 대입해야 한다.
6행의 주석을 제거하고 실행한다면, 에러가 난다. 비트 필드 구조체 멤버의 주소를 직접 구할 수 없기 때문이다.
1 2 3 4 5 6 7 8 | int main(void) { children child; int temp; scanf("%d", &temp); child.son = temp; //* scanf("%d", child.son); /* 에러 */ printf("%d \n", child.son); } | cs |
구조체 포인터와 -> 연산자
child. 과 같이 구조체 멤버에 직접 접근하는 거 외에도, 구조체를 가리키는 포인터를 통해 멤버에 접근할 수도 있다.
구조체 변수 전체의 주소를 구해, 그 값을 저장하는 것이 바로 구조체 포인터이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <stdio.h> typedef struct { int son; int daughter; } children; int main(void) { children child = { 1, 2 }; children *ps = &child; printf("아들은 몇 명? : %d \n", (*ps).son); printf("딸은 몇 명? : %d \n", ps->daughter); } | cs |
children 구조체를 가리키는 포인터 변수 ps에, child의 주소 연산 (&)을 통해 구한 변수의 주소값을 저장하는 것이다.
그러면 ps는 구조체 변수 child를 가리키게 된다.
멤버 접근 연산자인 . 연산자가 * 연산자 보다 우선 순위가 높기 때문에, * 연산자가 먼저 수행될 수 있도록 다음과 같이 괄호로 묶는 것이다.
(*ps).son
이것을 사용하기 편하게 해주는 것이 -> 연산자이다.
(*ps).son == ps->son
'Study > C' 카테고리의 다른 글
size_t (0) | 2017.05.29 |
---|---|
C 복습-콘솔 입출력 (0) | 2017.02.11 |
c 복습 (0) | 2016.11.03 |
파일의 분할과 헤더파일의 디자인 (0) | 2016.08.30 |
선행처리기와 매크로2 (0) | 2016.08.30 |