배열과 구조체와 포인터
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단계를 거쳐야 합니다.
-
먼저 구조체를 선언한다.
-
구조체를 선언한 후, 그 구조체형의 변수를 선언하여 이용한다.
또 이둘을 동시에 할 수 있습니다.
★구조체의 선언
구조체의 구성요소가 어떤 변수로 되어있는가 하나하나 정의하는 것을 선언이라고 합니다.
다음과 같이 선언을 합니다.
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 |