SlideShare uma empresa Scribd logo
1 de 34
The C++
     Programming
        Language
            5. 포인터, 배열, 구조체

                             아꿈사
    http://cafe.naver.com/architect1

                               해강
http://blog.naver.com/questionname

         아꿈사 오전반 C++ 뽀개기
                2013. 02. 16
                               1
시작하기 전에 목차를 봅시다




                  2
포인터 – 영 – 배열 – 배열 초기치 - 문자열 리터널
– 배열포인터 – 배열 순회 - 상수 – 포인터와 상수
- 참조자 - void* - 구조체 – 타입 동등 관계 – 고수의 조언




                                          3
몇장 안되는데 세부가 뭐 이리 많아!
 자잘해서 뭉뚱그릴 수도 없다…




                       4
따라서 발표 시간 예상이 안됨




                   5
6
그래서 빠르게 진행합니다
질문 있으시면 바로 이야기해주세요
  4장이 더 세부가 많은건 비밀




                     7
포인터란?
어떤 타입의 메모리 주소를 담을 수 있는 변수

char     c = „a‟;
char*    p = &c;         // p는 c의 주소를 가진다

int*     pi;             // int에 대한 포인터
char**   ppc;            // char에 대한 포인터에 대한 포인터
int*     ap[15];         // int에 대한 포인터가 15개 모인 배열
int      (*fp)(char*);   // int를 반환하고 char* 인자를 취하는 함수에 대한 포인터
int*     f(char*);       // char* 인자를 취하고 int에 대한 포인터를 반환하는 함수

포인터의 주된 사용은 역참조(dereferencing), 간접참조(indirection)
char  c = „a‟;
char* p = &c;
char  c2 = *p;


                                                                 8
NULL? 0!
널 포인터는 객체를 가리키지 않는 포인터라는 뜻으로 사용
C에서 사용되던 NULL은 문제를 일으킬 수 있으므로 0을 사용하자




그러나
개인적으로는 일반 변수와 포인터를 모두 0으로 처리하면 가독성이 떨어진다고 생각
변수명에 p를 통해 포인터 표시를 하기도 하지만 안 하는 사람도 많음

if( asdf == 0)   // asdf의 값을 검사하는 건가, 널포인터를 찾는건가?

이런 사람들은
const int NULL = 0;
으로 상수화 시켜 혹시 모를 재정의를 막는게 좋습니다




                                                    9
배열이란?
어떤 타입을 size만큼 갖는 것
배열내의 원소는 0~size – 1로 인덱싱
배열의 원소 개수는 상수여야 함

void f(int i)
{
             int v1[3]; // 3개의 int로 이루어진 배열, v1[0], v1[1]로 인덱싱
             int v2[i]; // 상수가 아니므로 에러
}

배열을 선언할 때 다차원 배열은 가능한 삼가고,
사용할 경우에는 별도의 래퍼로 감싸는 방법을 고안해볼 것
(다음 사용자가 해당 코드를 직접 건드리지 않도록)

그러나 표준 vector를 사용하면 깨끗이 해결



                                                                 10
배열 초기화
배열의 초기화시에는 리스트로 가능
int v1[] = {1,2,3,4};

단 대입은 안 됨
v2 = {„c‟, „d‟, 0}; // 에러



크기를 지정했을 경우는 크기를 초과하면 에러
char v3[2] = {„a‟, „b‟, 0}; // 에러

단 개수가 모자랄 경우는 0으로 채워짐
int v4[8] = {1, 2, 3, 4};
int v4[8] = {1, 2, 3, 4, 0, 0, 0, 0};   // 두개의 문장이 같다




                                                        11
문자열 리터럴이란?
큰 따옴표로 둘러싼 연속 문자 정적으로 만들어짐
“this is a string”

문자열 리터럴은 문자들의 개수보다 1이 더 크다
끝을 나타내는 0이 붙어 있기 때문
문자열 리터럴은 const 문자 상수가 여러 개 모인 배열임

문자열 리터럴을 char*에 대입할 수 있지만 변경하려고 하는건 잘못
변경시에는 문자 배열을 사용하자
char* p = “Plato”;
p[4] = „e‟;         // 에러
char p[] = “Plato”;
p[4] = „e‟;         // 성공




                                         12
문자열 리터럴 특징
정적으로 만들어지기 때문에 함수에서 반환해도 안전
return “error”;

똑같은 내용의 문자열 리터럴 두개의 메모리를 하나로 만들지는 구현별 정의사항
const char* p = “Heraclitus”;
const char* q = “Heraclitus”;
if(p == q) cout << “one!”;    // p, q 비교시 값이 아닌 포인터를 비교

백슬래시 방식 사용가능
cout << “beepn”;
“beep
message“                   // 이건 안됨 beepmessage가 됨

문자열 중간에 널문자를 넣을 수 있음
그러나 대부분 널문자 이후는 무시해버리는 것에 주의


                                                          13
배열 포인터
배열의 이름은 그 배열의 첫째 원소의 포인터
따라서 컴파일러가 알아서 변환
char v[] = “haha”;
char* p = v;       // char[]에서 char*로 암시적 변환

배열의 끝 다음은 유효한 원소를 가리키는게 아니기 때문에
데이터를 읽거나 쓰는 것은 불가능

따라서 배열의 크기 정보를 모른다면 에러 가능성
0을 기준으로 끝을 판단하기 때문에 비효율적

그러나 vector, string은 걱정 없음
가능한 c++ 스타일로 쓰자




                                               14
배열 순회
배열의 순회는 두가지 방법 존재
for(int i = 0 ; v[i] != 0 ; i++)        // 색인번호로 검사
for(char* p = v ; *p != 0 ; p++) // 원소 자체를 포인터로 해서 검사

두 연산은 서로 같은 결과
포인터 산술 연산은 타입의 size 만큼 증가하기 때문에 다음 원소를 가리킴

그러나 복잡한 포인터 산술 연산은 되도록 피하는 것이 정석
특히 배열 경계 밖으로 연산할 경우 쓰레기값이 들어간다
또, 포인터 끼리의 산술 계산은 말도 안 되는 오류
int v1[10];
int* p1 = v1 – 2; // *p1엔 이상한 값이 들어감
p1 + v1           // 컴파일도 안됨

배열 자체에는 원소의 개수 정보등이 없다는 것을 기억하자


                                                        15
상수의 특징
const라는 키워드를 통해 값을 수정할 수 없는 객체임을 지정
const int num = 50; // num은 상수 타입
const int x;                // 에러 초기 값이 없음

const 타입으로 선언된 것은 중간에 값이 바뀌지 않음

상수는 컴파일러에 따라 성능이 다름
const int c1 = 1;
const int c2 = my_f(3);
c1은 상수에 대한 저장공간이 필요없음
c2는 컴파일 타임에 값을 알 수 없어 저장공간이 필요
c2까지 최적화 해주는지는 환경에 따라 다름

상수는 일반적으로 배열 크기나 switch 문에 사용
매직 넘버를 막기 위해서
코드의 유지보수가 좋아짐

                                             16
포인터와 상수
포인터를 사용할 경우 포인터와 포인터가 가리키는 객체의 차이를 구별
void f(char* p)
{
      char s[] = “Sang”;
      const char* pc = s; // 상수 문자에 대한 포인터
      pc[3] = „g‟;        // 에러
      pc = p;             // ok

    char *const cp = s;   // 포인터 자체가 상수
    cp[3] = „g‟;          // ok
    cp = p;               // 에러
}

포인터를 상수로 만들고 싶을 경우 *const 사용




                                             17
포인터와 상수
상수에 대한 포인터에는 주소값을 대입할 수 있지만, 초기치에는 안됨
const int           c = 2;
int*                p = &c;       // 에러
const int* p2 = &c;         // ok

객체의 값이 변경될 여지를 만들기 때문
명시적 변환으로 없앨 수는 있음




                                          18
참조자란?
객체에 대한 다른 이름으로 함수의 인자와 반환값 정의에 쓰임
int    i = 1;
int&   r = i; // i를 r이란 이름으로 사용하겠다는 뜻
int    x = r; // x = 1
r = 2;        // i = 2 와 같은 표현




                                        19
참조자와 객체
객체에 참조자를 묶으려면 선언과 동시에 초기화 해야 한다
int        i = 1;
int&       r1 = i; // ok
int&       r2;     // 에러 초기치 필요
extern int& r3;    // ok 컴파일러는 r3가 어디선가 초기화됐다고 판단

참조자는 지정된 객체만 참조하므로,
참조자 자체의 포인터를 받아오거나 하는 것은 불가능

참조자는 객체가 아니다
따라서 포인터와 같은 조작은 불가능




                                                    20
참조자 특징
일반적인 T&은 초기화시 좌변값이 필요
double& dr = 1; // 좌변값이 없기 때문에 에러

그러나 const T&에 대한 초기치는 좌변값일 필요가 없다
T타입이 아니어도 무관
const double& cdr = 1; // ok

암시적 타입 변환이 일어나
결과값이 임시 변수에 저장되어
초기치로 사용되기 때문
double temp = double(1);  // 임시변수 제작
const double& cdr = temp; // cdr의 초기치로 사용

임시객체는 참조자의 유효범위가 끝날 때까지 유지된다
이때, 참조자를 변수에 대해서 사용하면 위험을 가지지만(임시 변수 대입)
상수에 대한 참조자의 경우에는 괜찮기 때문에 연산자 오버로딩에 널리 쓰임

                                            21
참조자 주의
참조자는 객체를 받아 정보를 바꾸는 함수에 사용 가능
그러나 가독성을 위해 인자 값을 다시 반환하거나, 포인터를 사용하는게 나음

void increment(int& aa) { aa++; }
int next(int p) { return p+1; }
void incr(int* p) { (*p)++; }

void f()
{
           int x = 1;
           increment(x);       // x = 2;
           x = next(x);        // x = 3;
           incr(&x);           // x = 4;
}




                                            22
참조자 사용
대입 연산의 좌변과 우변을 가지고 쓸 수 있는 함수를 정의하는데 사용
vector<struct> pairs;
double& value(const string& s)
{
          이 함수는 책에서 봅시다 자리가 없어요 168p
          return pairs[i].val;
}

while(cin >> buf)
{
           value(buf)++;
}

위 함수는 실수 객체의 값이 아니라 참조자를 반환한다
따라서 임시 값이 아닌 참조자가 가리키는 객체의 조작 가능
잦은 복사를 참조자를 통해 비용 절감

                                         23
void 포인터
void*는 객체의 타입에 상관 없이 모든 포인터를 대입 받을 수 있다
void* 끼리의 상등비교와 다른 타입으로의 변환도 가능
단 함수 포인터와 멤버 포인터는 대입 불가

대입 / 비교 / 변환 이외의 연산은 안전하지 않기 때문에 컴파일러 에러
실제 사용 위해서는 다른 타입으로 바꿔 주지 않으면 안 된다

int*    pi;
void*   pv = pi;                       // ok int*를 암시적 변환
*pv;                                   // 에러 역참조는 불가
pv++;                                  // 에러 가리키는 객체의 크기를 모르므로
int*    pi2 = static_cast<int*>(pv);   // ok int*로 명시적 변환

그러나 static_cast와 같은 변환은 가능한 삼가야할 스타일
more effective를 보면 형변환이 불편한 이유는 쓰지 말라고 그랬다는 말이 있음


                                                                 24
void 포인터 용도
1. 포인터가 가리키는 객체의 타입을 예측할 수 없을 때 함수에 대해 지정
2. 타입이 지정되지 않은 객체를 반환하고 싶을 때

실제 객체 조작을 위해서는 명시적 타입 변환이 필요

주로 하드웨어 리소스를 다루는 부분에서 사용
시스템 상부에서 보인다면 설계 미스의 가능성 염두

성능 최적화를 위해 쓰였다면 void*를 가리는 인터페이스를 사용하자




                                            25
구조체란?
구조체는 모든 타입의 원소가 임의로 구성된 것
struct address
{
          char*    name;
          long int number;
          char*    street;
          char*    town;
          char     state[2];
          long     zip;
};

구조체는 중괄호 뒤에 세미콜론을 붙여주는 것에 주의




                               26
구조체의 사용
구조체의 선언방법은 일반 변수와 동일하고, 구조체 멤버는 . 연산자를 통해 접근
address jd;
jd.name = “jim”;

배열과 같은 초기화 방법이 가능하지만 생성자를 통해 하는 것이 더 좋음
address jd = {“jim”, 61, {„N‟,‟J‟}};

구조체 타입의 객체를 포인터로 접근할 경우는 -> 사용
address* p;
p->name;
p가 포인터일때 p->m은 (*p).m과 같음

대입 연산 / 함수 인자로 전달 / 함수 반환 모두 가능
비교 연산은 정의 되어 있지 않으나 프로그래머가 직접 정의 가능




                                               27
구조체의 크기
구조체의 크기는 멤버의 크기를 모두 더한 값이 아닐 수도 있다
address 구조체의 경우 일반적으로 22를 생각
struct address
{
          char*    name;     //4
          long int number; //4
          char*    street;   //4
          char*    town;     //4
          char     state[2]; //2
          long     zip;      //4
};

그러나 대부분의 컴퓨터는 sizeof(address)가 24로 나온다
구조체 멤버 크기 순서에 따라 최적화를 할 수 있지만
그보단 프로그래머가 읽기 좋은 순서로 하는 것이 권장됨


                                         28
구조체 선언
구조체 타입은 이름이 등장한 이후라면 상관없음
struct Link
{
           Link* ok;
};

그러나 객체 선언은 구조체 타입의 선언이 끝난 후에 가능
struct Link
{
           Link error;
}
이는 컴파일러가 구조체의 크기를 결정할 수 없기 때문




                                  29
두개 이상의 구조체 참조
두개 이상의 구조체가 서로를 참조하게 하려면 전방선언 하면 된다
struct List;         //실제 정의는 나중에
struct Link
{
            List* Member;
};

struct List
{
              Link* head;
};
다만 정의되어 있지 않으면 에러

구조체는 클래스의 일종으로 멤버 접근 지정 규칙 외에는 동일하다




                                      30
구조체 이름
범위 안에 구조체와 이름이 똑같은 것이 있어도 문제는 없다
struct stat {…};
int stat(char* name, struct stat* buf);

그냥 이름을 쓰면 구조체가 아닌 것을 지칭
struct가 접두어로 들어가면 구조체를 가리키게 됨

그러나 쓰지 말자




                                          31
구조체 타입 동등 관계
똑같은 멤버를 가지더라도 이름이 다르면 서로 다른 타입이다
struct S1 { int a; };
struct S2 { int a; };

S1 x;
S2 y = x;   //에러

기본 타입과도 구분된다
S1 x;
int i = x; //에러

구조체와 같이 이름으로 사용되는 것들은 반드시 한번만 정의되어야 한다
이를 단일 정의 규칙 ODR이라 함




                                         32
고수의 조언으로 정리
1.   허용된 것 이외의 포인터 연산은 금물
2.   배열의 경계를 넘어선 데이터 기록은 하지 않도록 함
3.   NULL보다 0을 사용할 것
4.   기본 배열을 쓸 경우에는 vector와 valarray를 사용할 것
5.   0으로 끝나는 문자 배열의 경우 string을 사용할 것
6.   상수 제약이 없는 참조자 인자 사용 피할 것
7.   하부 수준의 코드 이외에는 void*를 피할 것
8.   매직 넘버 사용 대신에 기호 형태의 상수를 사용




                                             33
Q&A




      34

Mais conteúdo relacionado

Mais procurados

4. 함수포인터
4. 함수포인터4. 함수포인터
4. 함수포인터Hoyoung Jung
 
Secure coding-c-dcl-1
Secure coding-c-dcl-1Secure coding-c-dcl-1
Secure coding-c-dcl-1Seungyong Lee
 
More effective c++ chapter1,2
More effective c++ chapter1,2More effective c++ chapter1,2
More effective c++ chapter1,2문익 장
 
More effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshinMore effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshinDong Chan Shin
 
[Effective Modern C++] Chapter1 - item2
[Effective Modern C++] Chapter1 - item2[Effective Modern C++] Chapter1 - item2
[Effective Modern C++] Chapter1 - item2지환 김
 
[Effective Modern C++] Chapter1 - item1
[Effective Modern C++] Chapter1 - item1[Effective Modern C++] Chapter1 - item1
[Effective Modern C++] Chapter1 - item1지환 김
 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4현찬 양
 
More effective c++ 2
More effective c++ 2More effective c++ 2
More effective c++ 2현찬 양
 
2013 C++ Study For Students #1
2013 C++ Study For Students #12013 C++ Study For Students #1
2013 C++ Study For Students #1Chris Ohk
 
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++Min-soo Park
 
포인터와 참조자를 구분하자
포인터와 참조자를 구분하자포인터와 참조자를 구분하자
포인터와 참조자를 구분하자민욱 이
 
More effective c++ 항목30부터
More effective c++ 항목30부터More effective c++ 항목30부터
More effective c++ 항목30부터Dong Chan Shin
 
Python3 10장 문자열이야기
Python3 10장 문자열이야기Python3 10장 문자열이야기
Python3 10장 문자열이야기Jihoon Kong
 
정규표현식 Regular expression (regex)
정규표현식 Regular expression (regex)정규표현식 Regular expression (regex)
정규표현식 Regular expression (regex)Sunyoung Kim
 
Visual studio 2010
Visual studio 2010Visual studio 2010
Visual studio 2010MinGeun Park
 
[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features SummaryChris Ohk
 
Effective c++ Chapter1,2
Effective c++ Chapter1,2Effective c++ Chapter1,2
Effective c++ Chapter1,2문익 장
 

Mais procurados (20)

4. 함수포인터
4. 함수포인터4. 함수포인터
4. 함수포인터
 
Secure coding-c-dcl-1
Secure coding-c-dcl-1Secure coding-c-dcl-1
Secure coding-c-dcl-1
 
More effective c++ chapter1,2
More effective c++ chapter1,2More effective c++ chapter1,2
More effective c++ chapter1,2
 
More effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshinMore effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshin
 
[Effective Modern C++] Chapter1 - item2
[Effective Modern C++] Chapter1 - item2[Effective Modern C++] Chapter1 - item2
[Effective Modern C++] Chapter1 - item2
 
[Effective Modern C++] Chapter1 - item1
[Effective Modern C++] Chapter1 - item1[Effective Modern C++] Chapter1 - item1
[Effective Modern C++] Chapter1 - item1
 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4
 
More effective c++ 2
More effective c++ 2More effective c++ 2
More effective c++ 2
 
2013 C++ Study For Students #1
2013 C++ Study For Students #12013 C++ Study For Students #1
2013 C++ Study For Students #1
 
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
 
5 6 1
5 6 15 6 1
5 6 1
 
포인터와 참조자를 구분하자
포인터와 참조자를 구분하자포인터와 참조자를 구분하자
포인터와 참조자를 구분하자
 
9. pointer
9. pointer9. pointer
9. pointer
 
More effective c++ 항목30부터
More effective c++ 항목30부터More effective c++ 항목30부터
More effective c++ 항목30부터
 
Python3 10장 문자열이야기
Python3 10장 문자열이야기Python3 10장 문자열이야기
Python3 10장 문자열이야기
 
Java standard(8~13)
Java standard(8~13)Java standard(8~13)
Java standard(8~13)
 
정규표현식 Regular expression (regex)
정규표현식 Regular expression (regex)정규표현식 Regular expression (regex)
정규표현식 Regular expression (regex)
 
Visual studio 2010
Visual studio 2010Visual studio 2010
Visual studio 2010
 
[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary
 
Effective c++ Chapter1,2
Effective c++ Chapter1,2Effective c++ Chapter1,2
Effective c++ Chapter1,2
 

Semelhante a The C++ Programming Language 5장 포인터, 배열, 구조체

배열과 포인터
배열과 포인터배열과 포인터
배열과 포인터영기 김
 
More effective c++ Chap1~2
More effective c++ Chap1~2More effective c++ Chap1~2
More effective c++ Chap1~2Injae Lee
 
연산자 오버로딩
연산자 오버로딩연산자 오버로딩
연산자 오버로딩수빈 박
 
파이썬 스터디 9장
파이썬 스터디 9장파이썬 스터디 9장
파이썬 스터디 9장SeongHyun Ahn
 
[아꿈사] The C++ Programming Language 11장 연산자 오버로딩
[아꿈사] The C++ Programming Language 11장 연산자 오버로딩[아꿈사] The C++ Programming Language 11장 연산자 오버로딩
[아꿈사] The C++ Programming Language 11장 연산자 오버로딩해강
 
모어 이펙티브 c++ 1,2장 스터디
모어 이펙티브 c++ 1,2장 스터디모어 이펙티브 c++ 1,2장 스터디
모어 이펙티브 c++ 1,2장 스터디quxn6
 
Ec++ 3,4 summary
Ec++ 3,4 summaryEc++ 3,4 summary
Ec++ 3,4 summarySehyeon Nam
 
2012 Ds D2 03 Pdf
2012 Ds D2 03 Pdf2012 Ds D2 03 Pdf
2012 Ds D2 03 Pdfkd19h
 
Windosw via c 스터디2장
Windosw via c 스터디2장Windosw via c 스터디2장
Windosw via c 스터디2장HolyTak
 
2012 Ds D2 03
2012 Ds D2 032012 Ds D2 03
2012 Ds D2 03chl132435
 
Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택JinTaek Seo
 
학교에서 배우지 않는 C
학교에서 배우지 않는 C학교에서 배우지 않는 C
학교에서 배우지 않는 CHeesuk Kang
 
C++ Template/STL study
C++ Template/STL studyC++ Template/STL study
C++ Template/STL studySeo Dong-yu
 
Effective c++ 2
Effective c++ 2Effective c++ 2
Effective c++ 2현찬 양
 

Semelhante a The C++ Programming Language 5장 포인터, 배열, 구조체 (20)

배열과 포인터
배열과 포인터배열과 포인터
배열과 포인터
 
포인터
포인터포인터
포인터
 
More effective c++ Chap1~2
More effective c++ Chap1~2More effective c++ Chap1~2
More effective c++ Chap1~2
 
연산자 오버로딩
연산자 오버로딩연산자 오버로딩
연산자 오버로딩
 
파이썬 스터디 9장
파이썬 스터디 9장파이썬 스터디 9장
파이썬 스터디 9장
 
06장 함수
06장 함수06장 함수
06장 함수
 
java_2장.pptx
java_2장.pptxjava_2장.pptx
java_2장.pptx
 
C++ api design 품질
C++ api design 품질C++ api design 품질
C++ api design 품질
 
[아꿈사] The C++ Programming Language 11장 연산자 오버로딩
[아꿈사] The C++ Programming Language 11장 연산자 오버로딩[아꿈사] The C++ Programming Language 11장 연산자 오버로딩
[아꿈사] The C++ Programming Language 11장 연산자 오버로딩
 
모어 이펙티브 c++ 1,2장 스터디
모어 이펙티브 c++ 1,2장 스터디모어 이펙티브 c++ 1,2장 스터디
모어 이펙티브 c++ 1,2장 스터디
 
6 function
6 function6 function
6 function
 
Ec++ 3,4 summary
Ec++ 3,4 summaryEc++ 3,4 summary
Ec++ 3,4 summary
 
What’s new in c++11
What’s new in c++11What’s new in c++11
What’s new in c++11
 
2012 Ds D2 03 Pdf
2012 Ds D2 03 Pdf2012 Ds D2 03 Pdf
2012 Ds D2 03 Pdf
 
Windosw via c 스터디2장
Windosw via c 스터디2장Windosw via c 스터디2장
Windosw via c 스터디2장
 
2012 Ds D2 03
2012 Ds D2 032012 Ds D2 03
2012 Ds D2 03
 
Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택
 
학교에서 배우지 않는 C
학교에서 배우지 않는 C학교에서 배우지 않는 C
학교에서 배우지 않는 C
 
C++ Template/STL study
C++ Template/STL studyC++ Template/STL study
C++ Template/STL study
 
Effective c++ 2
Effective c++ 2Effective c++ 2
Effective c++ 2
 

Mais de 해강

[16.04.12] 플레이어의 기억에 남을 인상적인 캐릭터를 제작하는 5가지 주제 - Self
[16.04.12] 플레이어의 기억에 남을 인상적인 캐릭터를 제작하는 5가지 주제 - Self[16.04.12] 플레이어의 기억에 남을 인상적인 캐릭터를 제작하는 5가지 주제 - Self
[16.04.12] 플레이어의 기억에 남을 인상적인 캐릭터를 제작하는 5가지 주제 - Self해강
 
[15.06.20] 네가 누구든, 내가 뭘하든 - DevRookie
[15.06.20] 네가 누구든, 내가 뭘하든 - DevRookie[15.06.20] 네가 누구든, 내가 뭘하든 - DevRookie
[15.06.20] 네가 누구든, 내가 뭘하든 - DevRookie해강
 
[15.02.14] 진짜로땜빵하라하시면해야겠지만할시간도없고아무생각도없을때면어쩌면좋지라고소리쳐봤자아무도대답안해줄꺼고어쩔수없이이렇게저렇게어4신...
[15.02.14] 진짜로땜빵하라하시면해야겠지만할시간도없고아무생각도없을때면어쩌면좋지라고소리쳐봤자아무도대답안해줄꺼고어쩔수없이이렇게저렇게어4신...[15.02.14] 진짜로땜빵하라하시면해야겠지만할시간도없고아무생각도없을때면어쩌면좋지라고소리쳐봤자아무도대답안해줄꺼고어쩔수없이이렇게저렇게어4신...
[15.02.14] 진짜로땜빵하라하시면해야겠지만할시간도없고아무생각도없을때면어쩌면좋지라고소리쳐봤자아무도대답안해줄꺼고어쩔수없이이렇게저렇게어4신...해강
 
[14.12.27] 종횡사해2014(DevRookie)
[14.12.27] 종횡사해2014(DevRookie)[14.12.27] 종횡사해2014(DevRookie)
[14.12.27] 종횡사해2014(DevRookie)해강
 
[14.12.08] 행렬대수(ShaderStudy)
[14.12.08] 행렬대수(ShaderStudy)[14.12.08] 행렬대수(ShaderStudy)
[14.12.08] 행렬대수(ShaderStudy)해강
 
[14.10.21] Far Cry and DX9 번역(shaderstudy)
[14.10.21] Far Cry and DX9 번역(shaderstudy)[14.10.21] Far Cry and DX9 번역(shaderstudy)
[14.10.21] Far Cry and DX9 번역(shaderstudy)해강
 
[14.10.20] 아! 그거...모르겠습니다 - TLS(devrookie)
[14.10.20] 아! 그거...모르겠습니다 - TLS(devrookie)[14.10.20] 아! 그거...모르겠습니다 - TLS(devrookie)
[14.10.20] 아! 그거...모르겠습니다 - TLS(devrookie)해강
 
[14.10.10] TressFX 번역(self)
[14.10.10] TressFX 번역(self)[14.10.10] TressFX 번역(self)
[14.10.10] TressFX 번역(self)해강
 
[14.09.01] dynamic lighting in god of war3(shader study)
[14.09.01] dynamic lighting in god of war3(shader study)[14.09.01] dynamic lighting in god of war3(shader study)
[14.09.01] dynamic lighting in god of war3(shader study)해강
 
[14.06.28] 이 구역의 프로그래머는 나야(devrookie - 공개용)
[14.06.28]  이 구역의 프로그래머는 나야(devrookie - 공개용)[14.06.28]  이 구역의 프로그래머는 나야(devrookie - 공개용)
[14.06.28] 이 구역의 프로그래머는 나야(devrookie - 공개용)해강
 
[Shader study] the rendering technology of lords of the fallen - 발표메모(14.06.23)
[Shader study] the rendering technology of lords of the fallen - 발표메모(14.06.23)[Shader study] the rendering technology of lords of the fallen - 발표메모(14.06.23)
[Shader study] the rendering technology of lords of the fallen - 발표메모(14.06.23)해강
 
[Shader study] Lighting Killzone : Shadow Fall - 발표메모(13.10.14)
[Shader study] Lighting Killzone : Shadow Fall - 발표메모(13.10.14)[Shader study] Lighting Killzone : Shadow Fall - 발표메모(13.10.14)
[Shader study] Lighting Killzone : Shadow Fall - 발표메모(13.10.14)해강
 
[Shader study] Color control (2014.05.12)
[Shader study] Color control (2014.05.12)[Shader study] Color control (2014.05.12)
[Shader study] Color control (2014.05.12)해강
 
[Dev rookie] Omnibus Me (2014.01.11)
[Dev rookie] Omnibus Me (2014.01.11)[Dev rookie] Omnibus Me (2014.01.11)
[Dev rookie] Omnibus Me (2014.01.11)해강
 
[Shader study]Shadow Map Silhouette Revectorization(2014.01.06)
[Shader study]Shadow Map Silhouette Revectorization(2014.01.06)[Shader study]Shadow Map Silhouette Revectorization(2014.01.06)
[Shader study]Shadow Map Silhouette Revectorization(2014.01.06)해강
 
[Dev rookie]사망유희2013(13.12.21)
[Dev rookie]사망유희2013(13.12.21)[Dev rookie]사망유희2013(13.12.21)
[Dev rookie]사망유희2013(13.12.21)해강
 
[Dev rookie] 이상적인 게임에 관하여(13.11.30)
[Dev rookie] 이상적인 게임에 관하여(13.11.30)[Dev rookie] 이상적인 게임에 관하여(13.11.30)
[Dev rookie] 이상적인 게임에 관하여(13.11.30)해강
 
[Dev rookie] 어디로 가야 하나요(13.10.05)
[Dev rookie] 어디로 가야 하나요(13.10.05)[Dev rookie] 어디로 가야 하나요(13.10.05)
[Dev rookie] 어디로 가야 하나요(13.10.05)해강
 
[Softmax] 유익한 무엇에 관하여(13.09.27)
[Softmax] 유익한 무엇에 관하여(13.09.27)[Softmax] 유익한 무엇에 관하여(13.09.27)
[Softmax] 유익한 무엇에 관하여(13.09.27)해강
 
[Dev rookie] 나는 네가 무엇을 하고 있는지 알고 있다(13.08.24)
[Dev rookie] 나는 네가 무엇을 하고 있는지 알고 있다(13.08.24)[Dev rookie] 나는 네가 무엇을 하고 있는지 알고 있다(13.08.24)
[Dev rookie] 나는 네가 무엇을 하고 있는지 알고 있다(13.08.24)해강
 

Mais de 해강 (20)

[16.04.12] 플레이어의 기억에 남을 인상적인 캐릭터를 제작하는 5가지 주제 - Self
[16.04.12] 플레이어의 기억에 남을 인상적인 캐릭터를 제작하는 5가지 주제 - Self[16.04.12] 플레이어의 기억에 남을 인상적인 캐릭터를 제작하는 5가지 주제 - Self
[16.04.12] 플레이어의 기억에 남을 인상적인 캐릭터를 제작하는 5가지 주제 - Self
 
[15.06.20] 네가 누구든, 내가 뭘하든 - DevRookie
[15.06.20] 네가 누구든, 내가 뭘하든 - DevRookie[15.06.20] 네가 누구든, 내가 뭘하든 - DevRookie
[15.06.20] 네가 누구든, 내가 뭘하든 - DevRookie
 
[15.02.14] 진짜로땜빵하라하시면해야겠지만할시간도없고아무생각도없을때면어쩌면좋지라고소리쳐봤자아무도대답안해줄꺼고어쩔수없이이렇게저렇게어4신...
[15.02.14] 진짜로땜빵하라하시면해야겠지만할시간도없고아무생각도없을때면어쩌면좋지라고소리쳐봤자아무도대답안해줄꺼고어쩔수없이이렇게저렇게어4신...[15.02.14] 진짜로땜빵하라하시면해야겠지만할시간도없고아무생각도없을때면어쩌면좋지라고소리쳐봤자아무도대답안해줄꺼고어쩔수없이이렇게저렇게어4신...
[15.02.14] 진짜로땜빵하라하시면해야겠지만할시간도없고아무생각도없을때면어쩌면좋지라고소리쳐봤자아무도대답안해줄꺼고어쩔수없이이렇게저렇게어4신...
 
[14.12.27] 종횡사해2014(DevRookie)
[14.12.27] 종횡사해2014(DevRookie)[14.12.27] 종횡사해2014(DevRookie)
[14.12.27] 종횡사해2014(DevRookie)
 
[14.12.08] 행렬대수(ShaderStudy)
[14.12.08] 행렬대수(ShaderStudy)[14.12.08] 행렬대수(ShaderStudy)
[14.12.08] 행렬대수(ShaderStudy)
 
[14.10.21] Far Cry and DX9 번역(shaderstudy)
[14.10.21] Far Cry and DX9 번역(shaderstudy)[14.10.21] Far Cry and DX9 번역(shaderstudy)
[14.10.21] Far Cry and DX9 번역(shaderstudy)
 
[14.10.20] 아! 그거...모르겠습니다 - TLS(devrookie)
[14.10.20] 아! 그거...모르겠습니다 - TLS(devrookie)[14.10.20] 아! 그거...모르겠습니다 - TLS(devrookie)
[14.10.20] 아! 그거...모르겠습니다 - TLS(devrookie)
 
[14.10.10] TressFX 번역(self)
[14.10.10] TressFX 번역(self)[14.10.10] TressFX 번역(self)
[14.10.10] TressFX 번역(self)
 
[14.09.01] dynamic lighting in god of war3(shader study)
[14.09.01] dynamic lighting in god of war3(shader study)[14.09.01] dynamic lighting in god of war3(shader study)
[14.09.01] dynamic lighting in god of war3(shader study)
 
[14.06.28] 이 구역의 프로그래머는 나야(devrookie - 공개용)
[14.06.28]  이 구역의 프로그래머는 나야(devrookie - 공개용)[14.06.28]  이 구역의 프로그래머는 나야(devrookie - 공개용)
[14.06.28] 이 구역의 프로그래머는 나야(devrookie - 공개용)
 
[Shader study] the rendering technology of lords of the fallen - 발표메모(14.06.23)
[Shader study] the rendering technology of lords of the fallen - 발표메모(14.06.23)[Shader study] the rendering technology of lords of the fallen - 발표메모(14.06.23)
[Shader study] the rendering technology of lords of the fallen - 발표메모(14.06.23)
 
[Shader study] Lighting Killzone : Shadow Fall - 발표메모(13.10.14)
[Shader study] Lighting Killzone : Shadow Fall - 발표메모(13.10.14)[Shader study] Lighting Killzone : Shadow Fall - 발표메모(13.10.14)
[Shader study] Lighting Killzone : Shadow Fall - 발표메모(13.10.14)
 
[Shader study] Color control (2014.05.12)
[Shader study] Color control (2014.05.12)[Shader study] Color control (2014.05.12)
[Shader study] Color control (2014.05.12)
 
[Dev rookie] Omnibus Me (2014.01.11)
[Dev rookie] Omnibus Me (2014.01.11)[Dev rookie] Omnibus Me (2014.01.11)
[Dev rookie] Omnibus Me (2014.01.11)
 
[Shader study]Shadow Map Silhouette Revectorization(2014.01.06)
[Shader study]Shadow Map Silhouette Revectorization(2014.01.06)[Shader study]Shadow Map Silhouette Revectorization(2014.01.06)
[Shader study]Shadow Map Silhouette Revectorization(2014.01.06)
 
[Dev rookie]사망유희2013(13.12.21)
[Dev rookie]사망유희2013(13.12.21)[Dev rookie]사망유희2013(13.12.21)
[Dev rookie]사망유희2013(13.12.21)
 
[Dev rookie] 이상적인 게임에 관하여(13.11.30)
[Dev rookie] 이상적인 게임에 관하여(13.11.30)[Dev rookie] 이상적인 게임에 관하여(13.11.30)
[Dev rookie] 이상적인 게임에 관하여(13.11.30)
 
[Dev rookie] 어디로 가야 하나요(13.10.05)
[Dev rookie] 어디로 가야 하나요(13.10.05)[Dev rookie] 어디로 가야 하나요(13.10.05)
[Dev rookie] 어디로 가야 하나요(13.10.05)
 
[Softmax] 유익한 무엇에 관하여(13.09.27)
[Softmax] 유익한 무엇에 관하여(13.09.27)[Softmax] 유익한 무엇에 관하여(13.09.27)
[Softmax] 유익한 무엇에 관하여(13.09.27)
 
[Dev rookie] 나는 네가 무엇을 하고 있는지 알고 있다(13.08.24)
[Dev rookie] 나는 네가 무엇을 하고 있는지 알고 있다(13.08.24)[Dev rookie] 나는 네가 무엇을 하고 있는지 알고 있다(13.08.24)
[Dev rookie] 나는 네가 무엇을 하고 있는지 알고 있다(13.08.24)
 

The C++ Programming Language 5장 포인터, 배열, 구조체

  • 1. The C++ Programming Language 5. 포인터, 배열, 구조체 아꿈사 http://cafe.naver.com/architect1 해강 http://blog.naver.com/questionname 아꿈사 오전반 C++ 뽀개기 2013. 02. 16 1
  • 3. 포인터 – 영 – 배열 – 배열 초기치 - 문자열 리터널 – 배열포인터 – 배열 순회 - 상수 – 포인터와 상수 - 참조자 - void* - 구조체 – 타입 동등 관계 – 고수의 조언 3
  • 4. 몇장 안되는데 세부가 뭐 이리 많아! 자잘해서 뭉뚱그릴 수도 없다… 4
  • 5. 따라서 발표 시간 예상이 안됨 5
  • 6. 6
  • 7. 그래서 빠르게 진행합니다 질문 있으시면 바로 이야기해주세요 4장이 더 세부가 많은건 비밀 7
  • 8. 포인터란? 어떤 타입의 메모리 주소를 담을 수 있는 변수 char c = „a‟; char* p = &c; // p는 c의 주소를 가진다 int* pi; // int에 대한 포인터 char** ppc; // char에 대한 포인터에 대한 포인터 int* ap[15]; // int에 대한 포인터가 15개 모인 배열 int (*fp)(char*); // int를 반환하고 char* 인자를 취하는 함수에 대한 포인터 int* f(char*); // char* 인자를 취하고 int에 대한 포인터를 반환하는 함수 포인터의 주된 사용은 역참조(dereferencing), 간접참조(indirection) char c = „a‟; char* p = &c; char c2 = *p; 8
  • 9. NULL? 0! 널 포인터는 객체를 가리키지 않는 포인터라는 뜻으로 사용 C에서 사용되던 NULL은 문제를 일으킬 수 있으므로 0을 사용하자 그러나 개인적으로는 일반 변수와 포인터를 모두 0으로 처리하면 가독성이 떨어진다고 생각 변수명에 p를 통해 포인터 표시를 하기도 하지만 안 하는 사람도 많음 if( asdf == 0) // asdf의 값을 검사하는 건가, 널포인터를 찾는건가? 이런 사람들은 const int NULL = 0; 으로 상수화 시켜 혹시 모를 재정의를 막는게 좋습니다 9
  • 10. 배열이란? 어떤 타입을 size만큼 갖는 것 배열내의 원소는 0~size – 1로 인덱싱 배열의 원소 개수는 상수여야 함 void f(int i) { int v1[3]; // 3개의 int로 이루어진 배열, v1[0], v1[1]로 인덱싱 int v2[i]; // 상수가 아니므로 에러 } 배열을 선언할 때 다차원 배열은 가능한 삼가고, 사용할 경우에는 별도의 래퍼로 감싸는 방법을 고안해볼 것 (다음 사용자가 해당 코드를 직접 건드리지 않도록) 그러나 표준 vector를 사용하면 깨끗이 해결 10
  • 11. 배열 초기화 배열의 초기화시에는 리스트로 가능 int v1[] = {1,2,3,4}; 단 대입은 안 됨 v2 = {„c‟, „d‟, 0}; // 에러 크기를 지정했을 경우는 크기를 초과하면 에러 char v3[2] = {„a‟, „b‟, 0}; // 에러 단 개수가 모자랄 경우는 0으로 채워짐 int v4[8] = {1, 2, 3, 4}; int v4[8] = {1, 2, 3, 4, 0, 0, 0, 0}; // 두개의 문장이 같다 11
  • 12. 문자열 리터럴이란? 큰 따옴표로 둘러싼 연속 문자 정적으로 만들어짐 “this is a string” 문자열 리터럴은 문자들의 개수보다 1이 더 크다 끝을 나타내는 0이 붙어 있기 때문 문자열 리터럴은 const 문자 상수가 여러 개 모인 배열임 문자열 리터럴을 char*에 대입할 수 있지만 변경하려고 하는건 잘못 변경시에는 문자 배열을 사용하자 char* p = “Plato”; p[4] = „e‟; // 에러 char p[] = “Plato”; p[4] = „e‟; // 성공 12
  • 13. 문자열 리터럴 특징 정적으로 만들어지기 때문에 함수에서 반환해도 안전 return “error”; 똑같은 내용의 문자열 리터럴 두개의 메모리를 하나로 만들지는 구현별 정의사항 const char* p = “Heraclitus”; const char* q = “Heraclitus”; if(p == q) cout << “one!”; // p, q 비교시 값이 아닌 포인터를 비교 백슬래시 방식 사용가능 cout << “beepn”; “beep message“ // 이건 안됨 beepmessage가 됨 문자열 중간에 널문자를 넣을 수 있음 그러나 대부분 널문자 이후는 무시해버리는 것에 주의 13
  • 14. 배열 포인터 배열의 이름은 그 배열의 첫째 원소의 포인터 따라서 컴파일러가 알아서 변환 char v[] = “haha”; char* p = v; // char[]에서 char*로 암시적 변환 배열의 끝 다음은 유효한 원소를 가리키는게 아니기 때문에 데이터를 읽거나 쓰는 것은 불가능 따라서 배열의 크기 정보를 모른다면 에러 가능성 0을 기준으로 끝을 판단하기 때문에 비효율적 그러나 vector, string은 걱정 없음 가능한 c++ 스타일로 쓰자 14
  • 15. 배열 순회 배열의 순회는 두가지 방법 존재 for(int i = 0 ; v[i] != 0 ; i++) // 색인번호로 검사 for(char* p = v ; *p != 0 ; p++) // 원소 자체를 포인터로 해서 검사 두 연산은 서로 같은 결과 포인터 산술 연산은 타입의 size 만큼 증가하기 때문에 다음 원소를 가리킴 그러나 복잡한 포인터 산술 연산은 되도록 피하는 것이 정석 특히 배열 경계 밖으로 연산할 경우 쓰레기값이 들어간다 또, 포인터 끼리의 산술 계산은 말도 안 되는 오류 int v1[10]; int* p1 = v1 – 2; // *p1엔 이상한 값이 들어감 p1 + v1 // 컴파일도 안됨 배열 자체에는 원소의 개수 정보등이 없다는 것을 기억하자 15
  • 16. 상수의 특징 const라는 키워드를 통해 값을 수정할 수 없는 객체임을 지정 const int num = 50; // num은 상수 타입 const int x; // 에러 초기 값이 없음 const 타입으로 선언된 것은 중간에 값이 바뀌지 않음 상수는 컴파일러에 따라 성능이 다름 const int c1 = 1; const int c2 = my_f(3); c1은 상수에 대한 저장공간이 필요없음 c2는 컴파일 타임에 값을 알 수 없어 저장공간이 필요 c2까지 최적화 해주는지는 환경에 따라 다름 상수는 일반적으로 배열 크기나 switch 문에 사용 매직 넘버를 막기 위해서 코드의 유지보수가 좋아짐 16
  • 17. 포인터와 상수 포인터를 사용할 경우 포인터와 포인터가 가리키는 객체의 차이를 구별 void f(char* p) { char s[] = “Sang”; const char* pc = s; // 상수 문자에 대한 포인터 pc[3] = „g‟; // 에러 pc = p; // ok char *const cp = s; // 포인터 자체가 상수 cp[3] = „g‟; // ok cp = p; // 에러 } 포인터를 상수로 만들고 싶을 경우 *const 사용 17
  • 18. 포인터와 상수 상수에 대한 포인터에는 주소값을 대입할 수 있지만, 초기치에는 안됨 const int c = 2; int* p = &c; // 에러 const int* p2 = &c; // ok 객체의 값이 변경될 여지를 만들기 때문 명시적 변환으로 없앨 수는 있음 18
  • 19. 참조자란? 객체에 대한 다른 이름으로 함수의 인자와 반환값 정의에 쓰임 int i = 1; int& r = i; // i를 r이란 이름으로 사용하겠다는 뜻 int x = r; // x = 1 r = 2; // i = 2 와 같은 표현 19
  • 20. 참조자와 객체 객체에 참조자를 묶으려면 선언과 동시에 초기화 해야 한다 int i = 1; int& r1 = i; // ok int& r2; // 에러 초기치 필요 extern int& r3; // ok 컴파일러는 r3가 어디선가 초기화됐다고 판단 참조자는 지정된 객체만 참조하므로, 참조자 자체의 포인터를 받아오거나 하는 것은 불가능 참조자는 객체가 아니다 따라서 포인터와 같은 조작은 불가능 20
  • 21. 참조자 특징 일반적인 T&은 초기화시 좌변값이 필요 double& dr = 1; // 좌변값이 없기 때문에 에러 그러나 const T&에 대한 초기치는 좌변값일 필요가 없다 T타입이 아니어도 무관 const double& cdr = 1; // ok 암시적 타입 변환이 일어나 결과값이 임시 변수에 저장되어 초기치로 사용되기 때문 double temp = double(1); // 임시변수 제작 const double& cdr = temp; // cdr의 초기치로 사용 임시객체는 참조자의 유효범위가 끝날 때까지 유지된다 이때, 참조자를 변수에 대해서 사용하면 위험을 가지지만(임시 변수 대입) 상수에 대한 참조자의 경우에는 괜찮기 때문에 연산자 오버로딩에 널리 쓰임 21
  • 22. 참조자 주의 참조자는 객체를 받아 정보를 바꾸는 함수에 사용 가능 그러나 가독성을 위해 인자 값을 다시 반환하거나, 포인터를 사용하는게 나음 void increment(int& aa) { aa++; } int next(int p) { return p+1; } void incr(int* p) { (*p)++; } void f() { int x = 1; increment(x); // x = 2; x = next(x); // x = 3; incr(&x); // x = 4; } 22
  • 23. 참조자 사용 대입 연산의 좌변과 우변을 가지고 쓸 수 있는 함수를 정의하는데 사용 vector<struct> pairs; double& value(const string& s) { 이 함수는 책에서 봅시다 자리가 없어요 168p return pairs[i].val; } while(cin >> buf) { value(buf)++; } 위 함수는 실수 객체의 값이 아니라 참조자를 반환한다 따라서 임시 값이 아닌 참조자가 가리키는 객체의 조작 가능 잦은 복사를 참조자를 통해 비용 절감 23
  • 24. void 포인터 void*는 객체의 타입에 상관 없이 모든 포인터를 대입 받을 수 있다 void* 끼리의 상등비교와 다른 타입으로의 변환도 가능 단 함수 포인터와 멤버 포인터는 대입 불가 대입 / 비교 / 변환 이외의 연산은 안전하지 않기 때문에 컴파일러 에러 실제 사용 위해서는 다른 타입으로 바꿔 주지 않으면 안 된다 int* pi; void* pv = pi; // ok int*를 암시적 변환 *pv; // 에러 역참조는 불가 pv++; // 에러 가리키는 객체의 크기를 모르므로 int* pi2 = static_cast<int*>(pv); // ok int*로 명시적 변환 그러나 static_cast와 같은 변환은 가능한 삼가야할 스타일 more effective를 보면 형변환이 불편한 이유는 쓰지 말라고 그랬다는 말이 있음 24
  • 25. void 포인터 용도 1. 포인터가 가리키는 객체의 타입을 예측할 수 없을 때 함수에 대해 지정 2. 타입이 지정되지 않은 객체를 반환하고 싶을 때 실제 객체 조작을 위해서는 명시적 타입 변환이 필요 주로 하드웨어 리소스를 다루는 부분에서 사용 시스템 상부에서 보인다면 설계 미스의 가능성 염두 성능 최적화를 위해 쓰였다면 void*를 가리는 인터페이스를 사용하자 25
  • 26. 구조체란? 구조체는 모든 타입의 원소가 임의로 구성된 것 struct address { char* name; long int number; char* street; char* town; char state[2]; long zip; }; 구조체는 중괄호 뒤에 세미콜론을 붙여주는 것에 주의 26
  • 27. 구조체의 사용 구조체의 선언방법은 일반 변수와 동일하고, 구조체 멤버는 . 연산자를 통해 접근 address jd; jd.name = “jim”; 배열과 같은 초기화 방법이 가능하지만 생성자를 통해 하는 것이 더 좋음 address jd = {“jim”, 61, {„N‟,‟J‟}}; 구조체 타입의 객체를 포인터로 접근할 경우는 -> 사용 address* p; p->name; p가 포인터일때 p->m은 (*p).m과 같음 대입 연산 / 함수 인자로 전달 / 함수 반환 모두 가능 비교 연산은 정의 되어 있지 않으나 프로그래머가 직접 정의 가능 27
  • 28. 구조체의 크기 구조체의 크기는 멤버의 크기를 모두 더한 값이 아닐 수도 있다 address 구조체의 경우 일반적으로 22를 생각 struct address { char* name; //4 long int number; //4 char* street; //4 char* town; //4 char state[2]; //2 long zip; //4 }; 그러나 대부분의 컴퓨터는 sizeof(address)가 24로 나온다 구조체 멤버 크기 순서에 따라 최적화를 할 수 있지만 그보단 프로그래머가 읽기 좋은 순서로 하는 것이 권장됨 28
  • 29. 구조체 선언 구조체 타입은 이름이 등장한 이후라면 상관없음 struct Link { Link* ok; }; 그러나 객체 선언은 구조체 타입의 선언이 끝난 후에 가능 struct Link { Link error; } 이는 컴파일러가 구조체의 크기를 결정할 수 없기 때문 29
  • 30. 두개 이상의 구조체 참조 두개 이상의 구조체가 서로를 참조하게 하려면 전방선언 하면 된다 struct List; //실제 정의는 나중에 struct Link { List* Member; }; struct List { Link* head; }; 다만 정의되어 있지 않으면 에러 구조체는 클래스의 일종으로 멤버 접근 지정 규칙 외에는 동일하다 30
  • 31. 구조체 이름 범위 안에 구조체와 이름이 똑같은 것이 있어도 문제는 없다 struct stat {…}; int stat(char* name, struct stat* buf); 그냥 이름을 쓰면 구조체가 아닌 것을 지칭 struct가 접두어로 들어가면 구조체를 가리키게 됨 그러나 쓰지 말자 31
  • 32. 구조체 타입 동등 관계 똑같은 멤버를 가지더라도 이름이 다르면 서로 다른 타입이다 struct S1 { int a; }; struct S2 { int a; }; S1 x; S2 y = x; //에러 기본 타입과도 구분된다 S1 x; int i = x; //에러 구조체와 같이 이름으로 사용되는 것들은 반드시 한번만 정의되어야 한다 이를 단일 정의 규칙 ODR이라 함 32
  • 33. 고수의 조언으로 정리 1. 허용된 것 이외의 포인터 연산은 금물 2. 배열의 경계를 넘어선 데이터 기록은 하지 않도록 함 3. NULL보다 0을 사용할 것 4. 기본 배열을 쓸 경우에는 vector와 valarray를 사용할 것 5. 0으로 끝나는 문자 배열의 경우 string을 사용할 것 6. 상수 제약이 없는 참조자 인자 사용 피할 것 7. 하부 수준의 코드 이외에는 void*를 피할 것 8. 매직 넘버 사용 대신에 기호 형태의 상수를 사용 33
  • 34. Q&A 34