C++ 일차원 배열을 인자로 전달 후 해당 배열의 Size 얻는 방법 (초보주의)

조회수 2496회

안녕하세요. C++ 초보자입니다.

일차원 배열을 인자로서 보내고 size, item을 얻는 함수와 출력할 print 함수를 만들려고 합니다.

일단 생성자까지는 아는 선에서 만들었지만 이후에 막혀버리네요..

질문은 이러합니다..

  1. int itemsize = sizeof(item) / sizeof(int); 가 왜 1이 출력되는지 모르겠어요. sizeof(int)가 4바이트인건 외워서 알고 있지만 왜 sizeof(item)도 4일까요? int형 기준으로 4*배열 원소의 개수가 size가 되야하지 않을까 싶지만 정작 원소가 4개든 6개든 8개든 출력해보면 모두 1이 출력됩니다. 어떻게 해야할까요?
  2. itemSize가 잘 작동한다고 가정하고 이후에 getsize함수 부분을 작성한다고 하면.. return itemsize을 쓰려고해도 생성자 안에 정의해둔 itemsize 변수를 getsize함수에서 사용할 수 없네요.. 다른 함수에 있는 변수를 사용하려면 어떻게 해야하나요?
  3. (2번과 비슷한 질문) getitem에서 역시 Set생성자 안의 item을 쓰려고 item에 접근하려면 어떻게 해야할까요?
class Set {
private:
    int *set;
    int size = 0;
public:
    Set(int *set, int size);
    int getsize();
    int getitem(int index);
    void print();
};

Set::Set(int *set, int size) { 
    int item = 0;
    for (int i = 0; i < size; i++) {
        item = set[i];
    }
    int itemsize = sizeof(item) / sizeof(int); // 왜 1이 출력..?
}

int Set::getsize() {
//return itemSize?
}

int Set::getitem(int index) {
}

void Set::print() {
}


void main() {
    int a[] = { 3,1,9,10,5,8 };
    int b[] = { 2,4,5,8 };
    Set a1(a, 6);
    Set a2(b, 4);
}

  • 저도 한 수 배워갑니다 링고 2016.9.26 17:32

1 답변

  • 좋아요

    2

    싫어요
    채택 취소하기

    안녕하세요! 이번에도 제가 답변을 달아 드리겠습니다.... ㅎ;

    코드에 주석을 달아 설명해 드리겠습니다.

    class Set {
    private:
        int *set;
        //int size; 필요 없는 변수 입니다. itemsize라는 변수가 생겼기 때문입니다.
        int itemsize;
    
    public:
        Set(int *set, int _size);
        ~Set();
        int getsize();
        int getitem(int index);
        void print();
    };
    
    Set::Set(int *_set /* 이름이 같지 않게 사용해 주세요. */, int _size): itemsize(0)// 멤버 변수 초기화 입니다.
    { 
        // int item = 0; 아마 int형 배열을 저장하기 위해 사용하신 것 같습니다.
        //               하지만 실제로는 int형 변수 하나를 선언하신 겁니다. 그리고
        //               생성자 역시 함수 이므로 함수 내부에서 선언한 지역변수는 함수가
        //               끝날때 같이 사라집니다.
        this->set = new int[_size]{0,};
    
        for (int i = 0; i < _size; i++) {
            //item = set[i]; int형 변수에 저장해봤자 다시 덮어씌우기 때문에 마지막 데이터만 저장 됩니다.
            this->set[i] = _set[i];
        }
        //itemsize = sizeof(item) / sizeof(int); // 왜 1이 출력..?
        // int item 은 4바이트 int형 변수입니다. 따라서 int의 사이즈로 나누면 1이 나옵니다.
    
        itemsize = _size;    // 어차피 사이즈는 넘겨받으니 그대로 사용 하시면 됩니다.
    
    }
    
    int Set::getsize() {
        return itemsize; // 그대로 사용 하시면 됩니다.
    }
    
    int Set::getitem(int index) {
        return this->set[index];
    }
    
    void Set::print() {
    }
    
    Set::~Set() {
        delete this->set;
    }
    
    int main() {
        int a[] = { 3,1,9,10,5,8 };
        int b[] = { 2,4,5,8 };
        Set a1(a, 6);
        Set a2(b, 4);
    
        return 0;
    }
    
    
    • this->set = new int[_size]{0,}; 부분은 어떤 의미를 갖나요? 클래스의 set변수로 뭔가를 넣어주는 것 같긴한데 뭔지 모르겠네요..{0, } 라고 되어 있는 이 부분은 아예 이해가 가질 않네요..ㅠ 이성우 2016.9.24 17:16
    • 배열 원소의 개수를 출력하려면 그에 대한 전체 길이를 알아야 합니다. 하지만 그 길이를 구하는 방법을 알기는 어렵습니다. 여러 방법이 있습니다만 애초에 포인터로 배열을 받기 때문에 미리 그 크기를 지정받아야 합니다. 따라서 포인터로, 함수의 인자(매개변수)로 배열을 받을때는 크기를 항상 지정받아야 합니다. 유현호 2016.9.24 17:39
    • this->set = new int[_size]{0,}; 에서 this->set은 해당 인스턴스클래스(this)의 멤버변수 int *set에 new(동적할당)을 int[_size] 만큼의 길이(int형 _size길이의 배열)를 할당 해 주는 것입니다. 그리고 {0,}는 그 배열의 내부 값들을 모두 0으로 초기화 해주는 것입니다. {0}, {0,}, {0,0,0,0} 등으로 초기화 해 줄 수 있습니다. 유현호 2016.9.24 17:42

답변을 하려면 로그인이 필요합니다.

Hashcode는 개발자들을 위한 무료 QnA 사이트입니다. 계정을 생성하셔야만 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 계정을 생성하셔야만 글을 작성하실 수 있습니다.