<배열>
※연속적인 항목들이 동일한 크기의 순서를 갖고 나열되어 있는 데이터의 집합
1. 같은 평수로 구성된 아파트
2. int x[5]; //4byte짜리 5가구
<일차원배열>
※ int score[7];
1. 배열명 만드는 규칙은 변수명 만드는 규칙과 동일
2. 배열 선언문에서 사용하는 첨자는 양의 정수이며 배열의 크기
3. score배열은 정수형 자료 7개를 저장할 수 있음
4. 7개의 공간을 배열의 원소(element)라 함
<배열원소 예>
#include <stdio.h> int main(void) { int num[3]; <배열 선언시 첨자의 값은 배열의 크기> num[0]=10; <배열 원소(element)의 첨자는 순서> num[1]=20; num[2]=30; //num[3]=40; <num의 공간은 [0] [1] [2] 3칸이 끝이므로 오류가 발생한다> printf("%d, %d, %d ",num[0],num[1],num[2]); return 0; }
<일차원 배열 초기화>
●일차원 배열 초기화 방법
▶int score[5]={10,20,30,40,50}; //int x = 10;
●문자형 배열 초기화 방법
▶char name[ ]={'H','a','n',' ','S',' ','H','\0'};
▶char name[ ]="Han S H";
1. 배열 선언과 함께 초기화까지 할 경우 원소의 개수 8은 생략 가능
2. 문자 배열의 마지막 원소는 반드시 널(NULL) 문자인 '\0'#include <stdio.h> int main(void) { int score[5] = { 10,20,30,40,50 }; char name[] = { 'H','a','n' ,' ','S',' ','H', '\0' }; char name1[] = "Han S H"; printf("%d %d %d\n", score[0], score[1], score[4]); printf("%c%c%c%c%c\n", name[1], name[7], name[0],name[3],name[0]); printf("%c%c%c%c%c\n", name1[1], name1[7],name1[0],name1[3], name1[0]); return 0; }
1.배열 원소가 초기화 데이터 수보다 많으면 나머지 원소들은 0으로 초기화됨
int han[100]={10,20}
2.배열 원소의 수가 초기화한 데이터 수보다 적으면 “초기화 데이터가 너무 많다”는 에러가 발생int han[2]={10,20,30} error C2078: 이니셜라이저가 너무 많습니다.
<배열의 초기화 에러>
#include <stdio.h> int main(void) { int han[10] = { 10,20 }; int han1[2] = { 10,20,30 }; <error C2078: 이니셜라이저가 너무 많습니다.> int han2[10] = {0}; printf("%d %d %d %d\n", han[0], han[1], han[2],han[9]); printf("%d %d %d\n", han2[0], han2[1], han2[9]); return 0; }
<배열의 초기화와 대입>
#include <stdio.h> int main(void) { int han[10] = { 10,20 };<초기화> int x = 10; printf("%d %d %d %d\n", han[0], han[1],han[2],han[9]); x = 20; han[0] = 1; <대입> han[1] = 2; <대입> han[2] = 3; <대입> printf("%d %d %d %d\n", han[0], han[1], han[2], han[9]); return 0; }
<일차원 배열의 이름 : 배열의 시작주소>
<han1의 주소는 &han1[0]의 주소와 같다.> #include <stdio.h> int main(void) { int i; int han1[3] = { 10,15 }; int han2[3]; for (i = 0; i < 3; i++)printf("han1[%d]=%d 주소=%p\n", i, han1[i], &han1[i]); printf("han1=%p\n", han1); //&han1[0] han2[0] = 10; han2[1] = 20; han2[2] = 30; for (i = 0; i < 3; i++)printf("han2[%d]=%d 주소=%p\n", i, han2[i], &han2[i]); printf("han2=%p\n", han2); //&han2[0] return 0; }
<일차원 배열 활용>
#include <stdio.h> int main(void) {int i, sum = 0; int score[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9,10 }; for(i = 0; i < 10;i++) sum = sum + score[i]; printf("평균=%f\n", sum / 10.); return 0; }
<2차원 배열의 초기화>
#include <stdio.h> int main(void) { int x[2][3] = { 10,20,30,40,50,60 }; printf("%d %d %d\n", x[0][0], x[0][1], x[0][2]); printf("%d %d %d\n", x[1][0], x[1][1], x[1][2]); printf("%d\n", x[2][3]); <오류는 나지 않지 않지만 엉뚱한 값이 나옴> return 0; }
<2차원 배열의 초기화와 대입>
#include <stdio.h> int main(void) { int x[2][3] = { 10,20,30,40,50,60 }; printf("%d %d %d\n", x[0][0], x[0][1], x[0][2]); x[0][0] = 1; x[0][1] = 2; x[0][2] = x[0][0]; printf("%d %d %d\n", x[0][0], x[0][1], x[0][2]); x[1][0] = x[0][0] + 1; x[1][1] = x[0][0] + x[0][1]; x[1][2] = x[1][0] * x[1][1]; printf("%d %d %d\n", x[1][0], x[1][1], x[1][2]); return 0; }
<2차원 배열을 일차원 배열처럼 사용>
#include <stdio.h> int main(void) { int i, j; int han[2][3] = { 10,20,30,40,50,60 }; for (i = 0; i < 2; i++) for (j = 0; j < 3; j++) printf("han[%d][%d]=%d 주소=%p\n", i, j, han[i][j], &han[i][j]); printf("han=%p\n", han); <첫 번째 원소의 주소> printf("han[0]=%p\n", han[0]); <han[0]으로 시작하는 원소의 시작 주소> printf("han[1]=%p\n", han[1]); <han[1]로 시작하는 원소의 시작 주소> return 0; } <실행 결과> han[0][0] = 10 주소 = 0051FA80 han[0][1] = 20 주소 = 0051FA84 han[0][2] = 30 주소 = 0051FA88 han[1][0] = 40 주소 = 0051FA8C han[1][1] = 50 주소 = 0051FA90 han[1][2] = 60 주소 = 0051FA94 han = 0051FA80 han[0] = 0051FA80 han[1] = 0051FA8C
<문자형 배열 초기화 방법>
#include <stdio.h> int main(void) { int i; char st[] = "soft"; char ch[] = { 's', 'o', 'f', 't', '\0' }; for (i = 0; i < 5; i++)printf("st[%d] 주소 %p =%c\n", i, &st[i], st[i]); for (i = 0; i < 5; i++)printf("ch[%d] 주소 %p =%c\n", i, &ch[i], ch[i]); return 0; } <실행 결과> st[0] 주소 010FFC60 = s st[1] 주소 010FFC61 = o st[2] 주소 010FFC62 = f st[3] 주소 010FFC63 = t st[4] 주소 010FFC64 = ch[0] 주소 010FFC50 = s ch[1] 주소 010FFC51 = o ch[2] 주소 010FFC52 = f ch[3] 주소 010FFC53 = t ch[4] 주소 010FFC54 =
<문자형 배열 초기화와 배열명>
#include <stdio.h> int main(void) { char eng[5] = "A BC"; char kor[6] = "하이a"; printf("%p:%c ", eng, eng[0]); printf("%p:%c ", eng + 1, eng[1]); printf("%p:%c ", eng + 2, eng[2]); printf("%p:%c ", eng + 3, eng[3]); printf("%p:%c\n", eng + 4, eng[4]); printf("%s\n", eng); printf("%p:%c ", kor, kor[0]); printf("%p:%c ", kor + 1, kor[1]); printf("%p:%c ", kor + 2, kor[2]); printf("%p:%c ", kor + 3, kor[3]); printf("%p:%c ", kor + 4, kor[4]); printf("%p:%c\n", kor + 5, kor[5]); printf("%s\n", kor); return 0; } <실행 결과> 0073F970:A 0073F971 : 0073F972 : B 0073F973 : C 0073F974 : A BC <한글은 2바이트 인데 1바이트만 출력하므로 ?가 출력됨> 0073F960 : ? 0073F961 : ? 0073F962 : ? 0073F963 : ? 0073F964 : a 0073F965 : 하이a
<이름을 입력받아 출력하는 프로그램>
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main(void) { char name[10]; printf("당신의 이름을 입력하세요="); scanf("%s", name); //gets(name);와 차이점? printf("당신의 이름은 %s입니다.\n", name); return 0; }
<5개의 이름을 입력받아 출력하는 프로그램>
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main(void) { int i; char name[5][10]; for(i=0;i<5;i++) { printf("당신의 이름을 입력하세요="); scanf("%s",name[i]); } for(i=0;i<5;i++) printf("당신의 이름은 %s입니다.\n",name[i]); return 0; }
<int형 char형 값 복사>
#include <iostream> int main(void) { int x; int y = 10; char a, b = 'A'; x = y; std::cout << "x=" << x << " y=" << y << std::endl; a = b; std::cout << "a=" << a << " b=" << b << std::endl; return 0; }
<배열의 복사는 strcpy() 함수 사용>
#define _CRT_SECURE_NO_WARNINGS <Visual Studio의 경우> #include <iostream> #include <string> <or string.h(clang++, gcc 등 주로 온라인 컴파일러)> int main(void) { char s1[5]; char s2[5] = "soft"; <원본> //s1 = s2; <error C3863: 배열 형식 'char [5]'은(는) 할당할 수 없습니다.> strcpy(s1, s2); <s2주소의 문자열을 널 문자를 만날 때까지s1주소로 복사> std::cout << "s1=" << s1 << " s2=" << s2<< std::endl; return 0; }
<고양이 클래스 예>
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> <string.h> using std::cout; class Cat { private: <생략가능> int age; char name[20]; public: int getAge(); const char* getName(); void setAge(int a); void setName(const char* pName); }; int Cat::getAge() { return age; } void Cat::setAge(int a) { age = a; } void Cat::setName(const char* pName) { strcpy(name, pName); } const char* Cat::getName() { return name; } int main() { Cat nabi; nabi.setName("나비"); nabi.setAge(3); <입력> cout << nabi.getName() << " 나이는 "<<nabi.getAge()<<"살이다."; return 0; }
<고양이 클래스 예2>
#define _CRT_SECURE_NO_WARNINGS #include <iostream> using std::string; using std::cout; <C> class Cat { private: <생략가능> int age; string name; <C> public: int getAge(); string getName(); void setAge(int a); void setName(string pName); }; int Cat::getAge() { return age; } void Cat::setAge(int a) { age = a; } void Cat::setName(string pName) { // strcpy(name, pName); name = pName; <C> } string Cat::getName() { return name; } int main() { Cat nabi; nabi.setName("나비"); nabi.setAge(3); <입력> cout << nabi.getName() << " 나이는 "<<nabi.getAge()<<"살이다."; return 0; }
<객체 배열>
#include <iostream> using std::cout; class Dog{ private: int age; public: int getAge(){return age;} <자동 inline함수> void setAge(int a){age=a;} <자동 inline함수> }; int main() { int i; Dog dd[5]; <Dog클래스형 객체배열 dd, 강아지 5마리>> for(i=0;i<5;i++){ dd[i].setAge(i); cout<<dd[i].getAge(); <01234> } return 0; }
<포인터 객체>
#include <iostream> using std::cout; class Dog{ private: int age; public: int getAge(){return age;} void setAge(int a){age=a;} }; int main() { Dog happy,*pd; <일반 객체 happy와 포인터 객체 pd, int x, *px;> pd=&happy; //px=&x; happy.setAge(5); <일반 객체는 '.'으로 멤버를 접근> cout<< pd->getAge(); <포인터 객체는 '->'로 멤버를 접근> return 0; }
<객체 배열과 포인터>
#include <iostream> using std::cout; class Dog { private: int age; public: int getAge() { return age; } void setAge (int a) { age = a; } }; int main() { Dog dd[5]; Dog* pd; pd = dd; <배열의 이름은 그 배열의 시작주소이다.> for (int i = 0; i < 5; i++) { pd -> setAge(i); cout << dd[i].getAge(); cout << pd-> getAge(); pd++; <다음 방의 주소로> } <011223344> return 0; }