본문 바로가기
CS/자료구조

배열과 구조체

by chogigang 2024. 3. 19.

 

배열

같은 타입의 값을 한꺼번에 여러 개 저장할수 있는 공간이입니다 여러 개의 저장 공간이 필요할때 각 변수를 독립적으로 선언하는것보단 배열을 이용해서 값들을 저장하여 사용하면 훨씬 편리합니다  배열에는 <인덱스,요소값>의 쌍의 집합으로 이루어 져있으며

인덱스는 그 배열안의 주소값 이라고 생각하면 편하며 주로 대부분의 프로그래밍 언어들은 인덱스 값이 0부터 시작합니다 즉

10의 크기의 배열이 있으면 0,1,2,3,4,5,6,7,8,9 까지의 인덱스를 가지고 있다라고 표현할수 있습니다

 

 

 

 

1차원 배열

흔히 사용하는 배열이며  사용하는 방법은 다음과 같습니다

int A[6]; //크기가 6인 int 배열 선언
A[2] =25; // A[2]에 25 저장
printf("%d",A[2]); // A[2]를 화면에 출력

 

 

2차원 배열 

배열은 다차원으로 확장할 수 있습니다. 예를들어 2차원 배열은 요소들이 2차원 형태로 나열 된 것입니다.

2차원 배열에서 가로줄을 행(row),세로줄을 열(column)이라고 합니다 

 

int A[2][3] ={{1,2,3},{4,5,6}};
int A[2][3] ={1,2,3,4,5,6} //첫 행부터 순서대로 요소의 초깃값으로 저장됨

 

 

문자열

문자열이란 문자의 배열을 의미합니다 C언어에서 하나의 문자는 작은 따옴표('')에 A와 같이 넣어서 표시하고 ,문자열은 큰따음표("") 에 넣어서

"Hello"와 같이 표시합니다. 문자 배열의 s1을 문자열 "Hello"로 초기화하는 문장과 메모리에 저장된 내용은 다음과 같습니다.

이때 문자열의 끝을 나타내는 \0(또는 0,NULL)이 마지막에 추가됩니다. 따라서 실제 문자열보다 최소 1바이트 이상의 큰 문자 배열이 필요합니다.  일반배열과는 달리 문자열은 한꺼번에 복사하거나(strcpy_s) 길이를 구하는 (strlen)등의 다양한 함수가 제공됩니다. 이를 사용하기 위해서는 <string.h>를 포합해야 합니다. 

#include <stdio.h>
#include <string.h>



int main(){
    char s1[16] ="hello world";
    char s2[16] = {'h','e','l','l','o',' ','w','o','r','l','d','\n'};
    char s3[]="hello wordl";
    char s4[] ={'h','e','l','l','o',' ','w','o','r','l','d','\n'};
    char s5[20];
    
    
    
    // s5=s1; 오류
    strcpy(s5,s1); //맥북 컴파일러는 strcpy_s 함수를 사용할수 없으며 strcpy_s(s5,20,s1); 이렇게 배열의 크기를 같이 정해준다.
    printf("s1: %s\n",s1);
    printf("s2: %s\n",s2);
    printf("s3: %s\n",s3);
    printf("s4: %s\n",s4);
    printf("s5: %s\n",s5);
    printf("문자열의 s1의 길이 : %d\n",strlen(s1));
    
}

 

구조체

복잡한 객체들은 보통 같은 자료형으로만 되어 있지는 않습니다. 예를들어 "학생 정보"를 표현할려면 "학번"과 같은 정수형 요소와 "이름"과 같은 문자열, "평균 학점" 과 같은 실수형 요소를 모두 포함해야 합니다 이때 구조체를 사용합니다. 즉 다양한 자료형의 데이터 모임 입니다.  구조체는 사용하기 전에 반드시 정의해야 합니다 형식은 다음과 같습니다

 

struct Student{

int id;  //학생의 학번
char name[100]; // 학생의 이름
double score; // 성적

};


struct Student a;




typedef struct Student_t{


int id;  //학생의 학번
char name[100]; // 학생의 이름
double score; // 성적

} Student;

Student a;

Student a = {202403156,"홍길동",96.3}; //구조체 에 선언한 자료형 순서대로 해줘야한다.

 

구조체 변수명 바로 뒤에 항목 연산자를 -> .   을첨가한 후 맴버 변수 이름을 적으면 그 변수에 순서와 상관없이  접근할 수 있습니다

a.id = 30830;
a.score = 92.3;
strcpy_s(a.name,20,"홍수아"); // a.name = "홍수아"; 는 오류 발생

문자열도 배열이므로 대입 연산자로 한꺼번에 복사할 수 없고 ,strcpy_s()를 사용해야합니다. 

 

구조체 연산

구조체 연산은 기본적으로 대입연산자 만 지원합니다 구조체 자체가 여러가지의 타입이 있기때문에 무엇을 기준으로 연산을 해야할지 컴파일러가 정할수 없기 때문에 구조체는 복사하는 대입연산자 뿐입니다. +,-,*,/ 와 같은 산술 연산자는 사용할수 없습니다. 

 

구조체를 포함하는 구조체

구조체를 포함한 구조체도 정의할수 이씃ㅂ니다. 

 

typedef struct{
int month;
int date;

}Birthday; 


typedef struct }
char name[20];
Birthday birthday;

}Friend;


void main(){

Friend list[45];
list[0].birthday.month= 7;
list[0].birthday.date=5;
strcpy_s(list[0].name,20,"Minyoung");

}

 

'CS > 자료구조' 카테고리의 다른 글

트리  (2) 2024.06.07
리스트  (0) 2024.05.21
큐 (queue)  (0) 2024.04.06
스택(Stack)  (1) 2024.03.26
자료구조와 알고리즘  (1) 2024.03.12