배열과 구조에 대해서 공부하고 더 나아가서 생각해 볼 수 있는 여러 알고리즘들에 대해 공부해 보겠습니다.
- 같은 타입의 데이터의 모임
- 연속적인 항목들이 동일한 크기로 메모리에 저장되는 구조
- 동일한 자료 유형이 여러 개 필요한 경우 이용할 수 있는 자료 구조
다음 코드와 같이 표현할 수 있습니다.
int a[] = {10, 30, 40, 50};
int b[4] = {1, 3};
int c[3];
char ch[] = "abcd";
sizeof(a) = 4;
sizeof(b) = 5;
- 배열의 선언의 경우 컴파일러는 연속적인 메모리 장소를 할당합니다.
- 실제 C에서는 list[i]라고 쓰면 C언어는 이것을 주소가 list[i]인 정수에 대한 포인터로 해석합니다.
int* list;
*list = list[0];
*(list + i) == list[i];
배열의 주소값은 배열의 0번째 인덱스의 주소값과 같습니다.
배열이 함수의 매개변수로 사용될 때, C에서 이를 처리하는 방식에 대해 고민해 보면 유용합니다.
C언어의 함수의 모든 매개변수는 함수 내에서 선언되어야 합니다.
그러나 배열에 대해서는 새로운 저장 공간이 함수 내에 할당되는 것이 아니라 메인 프로그램에서만 정의됩니다.
따라서 C언어에서는 매개변수 전달 방식이 값에 의한 호출(call-by-reference)임에도 불구하고 주소값이 바뀌기 때문에 배열 매개변수가 그 값들을 변경하게 만듭니다.
일반적인 변수의 선언과 사용은 정적(staic)으로 사용합니다.
하지만 메모리 사용 예측이 부정확한 경우는 충분한 메모리를 미리 확보해야 하기 때문에 비효율적일 수 있습니다.
동적 메모리 할당에는 malloc(), realloc(), calloc()을 사용할 수 있습니다.
int* arr;
arr = (int*)malloc(sizeof(int) * n);
free(arr)
- 서로 다른 여러가지 타입을 그룹화하는 방법
- 각각의 항목은 타입과 이름으로 식별됩니다.
struct{
char name[10];
int age;
float salary;
}person;
위 구조체는 이름이 person이고 다음 3개의 필드를 갖는 변수를 생성합니다.
다음과 같이 typedef 명령문을 사용하여 구조 데이터 타입을 생성할 수 있습니다.
typedef struct{
char name[10];
int age;
float salary;
}person;
person은 구조의 정의를 통해 정의된 타입이름이며 다음과 같이 변수를 선언할 수 있습니다.
person p1, p2;
구조 속에 또 다른 구조를 정의하여 사용할 수도 있습니다.
typedef struct{
int month;
int day;
int year;
} date
typedef struct{
char name[10];
int age;
float salary;
date birth;
}person;
당연히 c는 컴파일하는 과정이 위에서 아래이므로 이러한 구조를 사용할 시 포함되는 구조를 위에 선언해줘야 합니다.
- 구조체는 equlity check가 불가능 합니다.
- 각각의 내부 타입으로 접근해서 equlity check를 해야 합니다.
- assign은 가능합니다.
if(person1 == person2) //불가능 p1 = p2; //가능
typedef struct{
char data;
struct list* link; //자기 자신을 포인팅
}list;
몇몇 부정확한 정보들이 있네요.. 참고용으로 읽으시면 좋을 것 같습니다!