2016년 3월 12일 토요일

C++ 공부 3 - 구조체, 열거형 복습

CF) C언어 복습 구조체와 열거형

1. 구조체의 정의, 선언방법

struct point{
      int x;      
      int y;      
} p1,p2,p3;

struct point{
. . . . };
// ;를 붙임에 유의

struct point p1,p2,p3;

- 구조체 정의와 변수선언을 동시에 할 수도, 따로 할 수도 있음.
 
struct point p1 = {10,20}; // 성공
struct point p2;
p2 = {10,20} // 에러
p2.x = 10; // 성공
p2.y = 20; // 성공
 
- 구조체 멤버변수 초기화는 구조체 변수의 선언시 {}를 이용함.
- 이미 선언된 구조체의 초기화는 접근연산자 . 이용해야함.
 
typedef struct point POINT;
POINT p;
- typedef A B : “AB로 부르겠다의 의미
 
2. 구조체 대입

구조체가 배열과 다른 가장 큰 차이점은 대입이 가능하다는 점이다.
다음 코드는 초기화된 구조체 Friend1의 멤버들을 Friend2에 그대로 대입한다.

tag_Friend Friend1={"장달상", 19, 180.0 };
tag_Friend Friend2;
Friend2=Friend1;

i=j와 같이 정수형 변수끼리 대입하면 ij와 똑같은 값을 가지듯이 구조체를 대입하면 두 구조체의 모든 멤버는 같은 값을 가지게 된다,

물론 대입 연산자의 좌, 우변은 동일한 타입의 구조체여야 한다. 구조체끼리의 대입 연산 동작은 구조체의 길이만큼 메모리 복사로 정의되어 있는데 Friend2=Friend1대입문은 다음 코드와 기능상 동일하다.

memcpy(&Friend2,&Friend1,sizeof(Friend1));

Friend1 번지에서부터 sizeof(Friend1) 바이트만큼 Friend2번지로 복사하는 것이다. 따라서 구조체가 아무리 크더라도 대입만 하면 모든 멤버값을 한꺼번에 복사할 수 있으며 복사 속도도 비교적 빠른 편이다. 대입을 했으니 좌우변이 똑같아지는 것은 당연한 게 아닌가라고 생각하겠지만 결코 당연하다고만 생각할 것이 아니다.

배열의 경우는 타입과 크기가 같더라도 대입 연산자로 사본을 만들 수 없다. , 다음 코드는 컴파일되지 않는다.
 
 
int ar1[5]={1,2,3,4,5};
int ar2[5];
ar2=ar1; // 대입 자체가 안됨
 
3. 중첩 구조체
 
struct score{ int x, int y };
struct student{ int y, score s };
struct s1 = {3, {70, 60}};
s1.s.x , s1.s.y;
 
- 구조체를 중첩하여 사용가능.
- 이 경우 초기화는 {}로 구분하며, . 이용하여 멤버 구조체에 접근.
 
4. 구조체와 배열
 
struct score{ char name[10]; ...};
struct score sco[3];
strcpy(sco[1].name, “kang”);
 
- 구조체의 멤버로 배열 사용가능. 또한 구조체의 배열 선언도 가능.
- 구조체의 멤버 변수로 문자열 사용시,
선언과 초기화 따로 할 경우 strcpy로 초기화해야함에 유의.
(선언과 동시에 초기화할 경우 {}사용하면 ok)
 
5. 구조체와 포인터
 
struct student{ int x; char name[10]; char no[20]; } s1;
&s1 == &s1.x // true
 
- 한 구조체 변수의 시작주소는 첫 번째 멤버변수의 시작주소와 같다.
 
struct student stu = {5, “kang” , “hello”};
struct student* p1 = &stu;
stu.x == (*p1).x == p1->x
, stu.name == (*p1).name == p1->name
, stu.no == (*p1).no == p1 -> no
 
- ‘->’ 연산자는 포인터변수로 구조체에 접근시 사용한다.
- * 연산자보다 .연산자의 우선순위가 높으므로, ()를 사용한다.
 
6. 자기참조 구조체와 외부참조 구조체
 
자기참조 구조체: 구조체의 멤버변수로 같은 구조체의 포인터변수 가짐.
외부참조 구조체: 구조체의 멤버변수로 다른 구조체의 포인터변수 가짐.
 
7. 구조체와 함수
 
구조체의 대입연산시, 멤버변수의 값이 복사된다!
call-by-value, call-by-reference 구별해서 사용하면 됨.
함수에서 구조체를 반환시, 구조체가 지역변수라면 함수종료시에 사라지므로, 반드시 static으로 선언해야함.
 
8. 열거형
 
enum week{ ONE,TWO,THREE =5 ,FOUR....};
enum week p1 = ONE; // 0을 의미
 
- 가독성을 위해 사용.
- 자동으로 0부터 지정, 중간에 값 지정하면 그 값부터 1씩 증가.

댓글 없음:

댓글 쓰기