본문 바로가기

프로그래밍언어/C#

C++ 배열과 구조체와 포인터

배열과 구조체와 포인터

 

 

 http://mnworld.co.kr
뇌를자극하는 C++ 참고했습니다.


배열

★배열이란 ?

배열이란 같은 종류의 변수를 묶어서 정리하는 구조를 말합니다. 대량의 데이터를 취급할 때 아주 편리합니다. 데이터를 취급하는 것은 변수와 같으나 배열은 보다 많은 데이터를 취급 할 수 있습니다.

 

★배열선언

배열을 만들 때 사용됩니다. 배열의 선언은 jum[0] jum[1] jum[2] …

이렇듯 0부터 시작이 됩니다. 배열을 선언했을 뿐이므로 아직 데이터가 없는 빈 상자의 상태입니다.

 

★대입

배열선언으로 만들어진 각 배열상자의 뚜껑을 열고 숫자나 문자를 넣습니다. 즉, 만들어진 배열 요소에 값을 넣는 것을 변수에서와 같이 대입이라고 합니다.

Jum[0]=63;

Jum[1]=90;

Jum[2]=75

 

 

 

 

 

 

 

 

★참조

cout << 배열요소 << endl으로 배열요소에 저장되어 있는 데이터를 표시 할 수 있습니다.

#include <iostream>

Using namespace std;

{

int a[4];

a[0] = 5;

a[1] = 6;

a[2] = 7;

a[3] = 8;

for (int I = 3; i >= 0; i--)

cout << "a[" << i << "] = " << a[i] << endl;

cout << endl;

return 0;

}

 

 

★배열의 초기화

배열의 초기화에는 2가지 방법이 있습니다.

첫번째는 {}를 사용하여 값을 열거하는 것입니다. []안에는 요소수를 적게 됩니다.

 

        Int i[4] = { 5, 6, 7, 8 }

이때 요소를 나타내는 {}안의 숫자를 생략할 수 있습니다. {}안의 숫자가 차례대로 들어가게됩니다.

#include <iostream>

using namespace std;

int main( void )

{

    int a[4] = { 5, 6, 7, 8 };

    for (int i = 3; i >= 0; i--)

        cout << "a[" << i << "] = " << a[i] << endl;

    cout << endl;

    return 0;

}

 

 

★배열 요소에 대입

인덱스는 "0" ~ "요소수-1" 이외의 값을 지정하면 실행할 때 에러가 되므로 주의 해야 합니다. 왜냐하면 인덱스는 0부터 시작하므로 요소수보다 1작은 값이 되기 때문입니다.

#int a[4] = { 5, 6, 7, 8 };

a[5] = 9;

cout << a[5] << endl

 

 

★배열과 for문

배열의 인덱스가 정수이고, 반복하는 구조를 갖고 있습니다. 다음 프로그램의 경우 합계를 구하고 싶은 데이터를 입력합니다. 음수를 입력하면 입력이 종료가 됩니다.

+for 문 ? 프로그램은 기본적으로 위에서 아래로 실행하므로 직선적 흐름이라고 합니다. 이 직선적 흐름을 변경하여 프로그램에서 실현할 수 있는 처리에 다양성을 줄수 있도록 하는 것. 보통 반복값을 준비하여 그 값만큼 반복처리를 정합니다. `

 

 

#include <iostream>

using namespace std;

int main( void )

{

    const int MAX = 100;

    int i, d[MAX], ndata, sum = 0;

    cout << "복수 데이터의 합계를 구합니다" << endl

        << "입력 끝은 음수를 입력하십시오" << endl;

    for (i = 0; i < MAX; i++) {

        cout << "데이터" << i + 1 << " ? ";

        cin << d[i];

        if (d[i] < 0)

            break;

    }

    ndata = i;

    cout << endl;

    for (i = 0; ji < ndata; i++) {

        cout << "데이터" << i +1 << " = " << d[i] << endl;

        sum += d[i];

    }

    cout << endl

         << "데이터개수 = " << ndata << endl

         << "합계 : " << sum << endl;

    return 0;

}

 

 

 

 

포인터

★포인터

앞에서 설명한 것과 같이 변수 어드레스란 그 변수에 있는 메모리에 붙여진 번호이다.

예를 들어 변수 a의 어드레스가 200이라고 가정하면 이 200이라는 번호를 별도의 p에 대입할 수 있습니다.

a의 어드레스가 200일 때 이 200이란 변수를 p에다가 대입을 합니다. 이 경우 변수 p의 값은 a의 어드레스이며, 이 변수 p와 같이 어드레스가 들어있는 변수를 "포인트"라 합니다.

 

★포인트 선언(정의)

 

Int형 변수 a 를 선언하려면 int a; 로 해야 합니다. Int형 변수를 지시하는 포인터 p를 선언하는 것은

Int *p;

로 쓰기로 약속되어 있습니다. 변수 a의 선언은 단순히 int를 쓰면 되나 포인터 p는 변수명 앞에 *이 있어야 합니다.

 

★포인터로의 대입

Int형 변수 a를 정수 567를 대입하려면 a = 567; 으로 하였습니다.

하지만 포인터 p에 변수 a의 어드레스를 대입하려면,

p = &a;

로 쓰기로 약속되어 있습니다.

 

★포인터의 참조

Int형 변수 a의 값이 무엇인가 조사하려면 cout << a << endl; 로 쓰면 숫자가 화면에 나타났습니다. 포인터 p의 값이 무엇인가를 조사하려면

cout << p << endl;

로 쓰면 p에 저장되어 있는 어드레스 숫자가 화면에 나타나게 됩니다. 그런데 포인트가 지시하는 "다른 변수의 값까지 참조"하게 됩니다. 위와 같을 때는

cout<<*p<<endl;

이 때 * 이것은 간접 연산자라고 불리웁니다. 위와 같이 쓰기로 약속이 되어있습니다. 즉 포인터 앞에 p의 앞에 *를 붙여 *p라고 쓰면 그 포인터가 지시하고 있는 변수의 값을 나타내는 것입니다.

#include <iostream>

using namespace std;

int main()

{

int c = 1234, d;

int *p = &c;

d = *p;

cout << " 변수 c와 같은 " << d << "입니다" << endl;

return 0;

}

 

 

 

 

 

구조체

★구조체란 ?

구조체란 "관련 있는 복수의 항목을 하나로 통합한 것"입니다. 앞에서 공부한 배열은 동일한 형의 데이터를 하나로 통합한 것이나, 구조체는 다른 형이나 배열도 하나로 통합할 수 있습니다. 또, 배열에서는 배열요소가 모여 배열을 만들었습니다만, 구조체에서는 구조체 요소 하나하나를 멤버라고 합니다.

 

★구조체를 사용하려면 ?

구조체를 사용하려면 다음과 같이 2단계를 거쳐야 합니다.

  1. 먼저 구조체를 선언한다.
  2. 구조체를 선언한 후, 그 구조체형의 변수를 선언하여 이용한다.

또 이둘을 동시에 할 수 있습니다.

 

★구조체의 선언

구조체의 구성요소가 어떤 변수로 되어있는가 하나하나 정의하는 것을 선언이라고 합니다.

다음과 같이 선언을 합니다.

struct 구조체명 {

데이터 형 멤버명 1 ;

데이터 형 멤버명 2 ;

 

예를 들어, 학교에서 영어와 수학 시험을 본 후, 그 성적 처리를 생각해 보십시오. 어느 학생을 처리하려고 할 때, 그 학생은 "복수 데이터 형"의 데이터를 가질 것입니다. 즉, 다음과 같이 정의 할 수 있습니다.

Struct sudent {

int no;

char name[10];

int eng;

int math;

};

 

★구조체 변수의 선언

지금 까지 기본 데이터 형의 변수를 선언할때는

Int a;

와 같이 선언을 하였습니다. 구조체형 변수의 선언도 마찬가지입니다. 위와 같이 student라는 구조체가 선언되어 있다면, 구조체명을 사용하여 구조체형의 변수 (예를 들어 kim)를 다음과 같이 선언할 수 있습니다.

Student kim;

구조체명 변수명

 

★구조체와 구조체 변수를 동시에 선언

struct Student {

int no;

char name[10];

int eng;

int math;

} kim ; <~ 구조체와 변수명을 동시에 선언하고 있습니다.

student lee; <~이후부터는 구조체 변수를 추가 가능합니다.

★구조체의 초기화

기본 데이터 형의 변수 선언에서

Int a = 10;

같이 int 형 변수 a의 선언과 동시에 값을 대입하여 초기화하였습니다. 마찬가지로 구조체 변수의 초기화도 선언과 동시에 다음과 같이 초기화 할 수 있습니다.

struct student {

    int no;

    char name[10];

    int eng;

    int math;

}

Sudent kim = {1, "kimDJ", 89, 95};

구조체명 구조체변수명 초기화리스트

 

멤버의 개수가 많을 때는 줄바꿈을 하여 다음고 같이 작성해도 됩니다.

Student kim {

1;

"kimDJ";

89;

95

};

 

★구조체 멤버에 액세스(접근)

구조체 변수의 멤버를 참조하려면 도트 연산자를 사용하여 어느 멤버를 참조하는가를 지정합니다.

cout << kim.no << kim . name << kim.eng << endl;

구조체명 멤버명

 

구조체 변수에 데이터를 대입할 때에도 마찬가지로 변수명과 멤버명을 도트연산자 . 으로 연걸하여 대입기호 =를 이용한다. 단, 문자 배열일때는 strcpy()를 이용합니다.

#include <iostream>

using namespace std;

struct student {

    int n;

    char name[10];

    int eng;

    int math;

};

int main() {

    Student kim;

    kim.n = 5;

    strcpy(kim.name, "kimDj");

    kim.eng = 87;

    kim.ath = 94;

    cout << "구조체 변수 kim데이터 : " << kim.n << kim.name

        << kim.eng << kim.math << endl;

    Student lee;

    lee.n = 9;

    strcpy(lee.name, "leeKS");

    lee.eng = 98;

    lee.math = 89;

    cout << "구조체 변수 lee 데이터 : " << lee.n << lee.name

        << lee.eng << lee.math << endl;

    return 0

}

 

★구조체로의 대입

앞에서 도트 연산자를 사용해서 각 멤버에 액세스하고 대입연사자 (=)를 사용하여 값을 저장하는 방법을 알아 보았습니다. 여기서는 구조체 변수에 구조체 변수를 대입하는 방법에 대해서 알아봅니다.

기본형의 변수 정의로 예를 들면,

int a; 변수선언

int b = 1234; 변수에 데이터 대입(초기화)

a = b; a에 변수 b대입

에서 3과 같이 변수에 변수를 대입할수 있습니다.

#include <iostream>

using namespace std;

 

struct student {

    int n;

    char name[10];

    int eng;

    int math;

};

int main() {

    student kim;

    kim.n = 5;

    strcpy(kim.name, "kimDJ");

    kim.eng = 87;

    student lee;

    lee.n = 9;

    strcpy(lee.name, "leeKS");

    lee.eng = 98;\

        cout << "변수 kim 데이터: " << kim.n << kim.name << kim.eng << endl;

    cout << "변수 lee 데이터 : " << lee.n << lee.name << lee.eng << endl;

    kim = lee;

    cout << "***변수 kim 에 변수 lee를 대입***" << endl;

    cout << "변수 kim 데이터 : " << kim.n << kim.name << kim.eng << endl;

    return 0;

}

 

 

구조체와 포인터

★구조체와 포인터

구조체 변수를 포인터로 지시하려면, 포인터명 앞에 *을 붙여주면 됩니다.

char name[10];

int eng;

int math;

};

Student *ps;

구조체명 포인터명

 

포인터 어드레스를 대입하려면 다음과 같이 하면됩니다.

Student kim;

ps = &kim;

구조체 변수명

 

포인터를 사용하여 구조체를 참조하려면 -> 을 사용하면됩니다.

cout << ps -> no << ps -> name << ps -> age << endl;

 

 

 

 

#include <iostream>

using namespace std;

 

struct Person{

char name[10];

int age;

};

Int main()

{

person per1;

person *pper;

pper = &per1;

cout << " 이름은 : ";

cin >> pper -> name;

cout << " 나이는 : ";

cin << " 이름은 " << pper -> name << " 나이는 " << pper -> age << endl;

return 0;

}

 

구조체와 배열

★구조체와 배열

기본형 배열의 경우

int a[]; <<< 배열선언

int a[4] = {1, 3, 5, 7} <<< 배열에 데이터를 대입하여 초기화

int a[] = {1, 3, 5, 7}

cout << a[3] << endl; <<< 배열요소를 참조

 

배열은 위와 같이 동일한 종류의 변수를 정리한 것입니다. 구조체 배열도 위의 일반 기본형 배열과 같이 구조체 배열을 만들 수 있습니다. 이 구조체 배열은 데이터베이스 등에 사용됩니다.

 

★구조체 배열선언

Struct student {

Int no;

char name[10];

int eng;

};

Student group1[10];

각각선언

 

Struct student {

int no;

char name[10];

int eng;

} group1[10];

구조체 배열

 

★구조체 배열의 초기화

Student group1[10] {

{1, "이동준", 96}. <<구조체의 배열은 {}으로 둘러싼다.

{2, "안혜린", 89}.

{3, "우상수", 91}.

.

.

.

{9, "박상종", 91} <<마지막에는 콤마가 없다.

};

 

★구조체와 배열 참조

다음 for문을 이용하여 배열의 마지막 요소까지 반복합니다. 모두 동일한 표시를 하게 됩니다.

 

#include <iostream>

Using namespace std;

 

struct person {

int age;

char name[10];

};

Int main() {

Person ps[3];

for(int = 0; i < 3; i++) {

cout << " 나이 : ? " ; cin >> ps[i].age;

cout << " 이름 : ? " ; cin >> ps[i].name;

}

for(int j = 0; j < 3, j++) {

cout << " 나이 : " << ps[j].age << ", /t 이름 : "

<< ps[j].name << endl;

}

Return 0;

}

 

 

배열과 포인터

p = &arrays[6];

이와 같은 경우 이 포인터가 6번째 원소를 가리키게 되는 것이다.

#include <iostream>

using namespace std;

 

int main()

{

// 배열 정의

int array[10];

 

// 포인터가 array[5]를 가르키게 만든다.

int *p = &array[5];

 

// 포인터가 array[5]의 주소를 출력한다

cout << " p= " << p << "/n";

cout << "&array[5] = " << &array[5] << "/n";

 

         // 포인터가 array[6]을 가리키게 만든다.

         p++;

 

         // p의 값과 array[6]의 주소를 출력한다.

         cout << " p = " << p << "/n";

         cout << "&array[6] = " << &array[6] << "/n";

              

return 0;

}

 

P++ 의 경우 p의 값을 증가시켜 가르키게 됩니다. 이외에도 p += 1 이나 p = p + 1을 사용해도 관계 없습니다. 포인터 타입의 덧셈의 경우 그의미가 산술타입과 다릅니다. 포인터 변수에 1을 더하는 것은 " 다음 원소를 가르켜라 "라는 뜻을 가집니다.

 

★포인터간의 뺄셈

#include <iostream>

using namespace std;

 

int main()

{

// 두개의 포인터를 초기화한다.

    short sArrays[10];

    short* ps1 = &sArrays[3];

    short* ps2 = &sArrays[7];

 

    //결과를 출력한다.

    cout << "ps1 = " << ps1 << endl;

    cout << "ps2 = " << ps2 << endl;

    cout << "ps2 -ps1 = " << ps2 - ps1 << endl;

 

    return 0;

}

 

이 경우 ps2 – ps1을 배면 4라는 값이 출력된다. 이는 두 포인터가 가리키는 원소사이에 몇 개의 원소가 있는 지를 보여줍니다. 컴퓨터의 경우, short타입이면 우리는 1을 더했으면, 컴퓨터는 2를 더하게 됩니다. 포인터과 관련한 연산에서 우리가 사용하는 단위는 "원소 하나의 크기"가 되고 실제로 컴퓨터가 이것을 해석 할 땐 "바이트"라는 단위로 작업을 하게 됩니다.

 

'프로그래밍언어 > C#' 카테고리의 다른 글

닷넷의 배경 및 특징, 네임스페이스가 뭐죠?  (0) 2010.12.31
C# 테이블  (0) 2010.12.27
C# 컨트롤  (0) 2010.12.27
C#의 클래스  (0) 2010.12.27
Chapter 04 변수 – 정보를 담는 방법  (0) 2010.12.06