배열
같은 타입의 값을 한꺼번에 여러 개 저장할수 있는 공간이입니다 여러 개의 저장 공간이 필요할때 각 변수를 독립적으로 선언하는것보단 배열을 이용해서 값들을 저장하여 사용하면 훨씬 편리합니다 배열에는 <인덱스,요소값>의 쌍의 집합으로 이루어 져있으며
인덱스는 그 배열안의 주소값 이라고 생각하면 편하며 주로 대부분의 프로그래밍 언어들은 인덱스 값이 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");
}