📖UNIT36
📒배열을 선언하고 요소에 접근하기
먼저, 배열이 왜 필요한 지에 관한 설명은 생략하겠다.
배열의 기본적인 선언과 초기화는 자료형 배열이름[크기] = {값1, 값2, 값3 ..}; 이렇게 진행된다.
int array[5] = {10, 20, 30, 40, 50};
만약 배열이 이렇게 선언과 초기화가 된다면, array[0] = 10, array[4] = 50 이 될 것이다.
즉 인덱싱은 0번부터 진행된다.
만약 원소의 갯수는 정했지만, 배열의 크기를 계산하기 힘들다면
int array[] = {10, 20, 30, 40, 50};
이렇게 진행해주면 된디.
📒배열을 모두 0으로 초기화하기.
그런 배열의 모든 값을 0으로 초기화해주고 싶다면
int arr[10] = {0, }
이렇게 해주면 된다. arr의 모든 원소들이 0이 된다.
📒배열의 크기 구하기
그럼 이런 배열의 크기는 어떻게 구해야 할까.
sizeof(arr)
이렇게 해준다면 이미 하나의 정수값이 되었다.
만약 요소의 갯수를 구하고 싶다면
sizeof(arr)/sizeof(int)
이렇게 해주면 될 것이다.
📒요소를 다 출력하기
반복문에서 변수 i를 0부터 sizeof(arr) / sizeof(int) 가 되기 전까지 반복을 진행해주면 된다.
#include <stdio.h>
int main(void){
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for(int i = 0; i < sizeof(arr) / sizeof(int); i++){
printf("%d\n", arr[i]);
}
return 0;
}
이렇게 말이다 !
📒요소의 합 구하기
위의 출력하는 과정에서 출력되는 요소들의 합을 다 더해주면 된다.
#include <stdio.h>
int main(void){
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int sum = 0;
for(int i = 0; i < sizeof(arr) / sizeof(int); i++){
printf("%d\n", arr[i]);
sum += arr[i];
}
return 0;
}
📒배열을 포인터에 넣기
배열은 그 자체로 포인터의 성질을 띈다.
그래서 일반적인 변수는 int *numPtr = &num1; 과 같이 사용하였다면
배열은 int *arrPtr = arr; 로 지정해주어야 한다.
이렇게 된다면 역참조를 진행할 때 arrPtr[3] 과 같이 사용할 수 있다. (배열 자체도 마찬가지이다.)
📖UNIT37
📒이차원 배열 사용하기
이차원배열은 아까 우리가 만든 그 일차원 배열을 가로 세로로 만든 것이다.
먼저 선언하는 방법은 넘어가고 바로 초기화를 진행해보자.
만약 배열의 모든 원소를 0으로 초기화하려면 어떻게 해야 할까
#incldue <stdio.h>
int main(){
int numarr[3][4] = {0, };
return 0;
}
이렇게 해주면 배열의 모든 원소들은 한 번에 0으로 초기화된다.
📒이차원 배열의 크기 구하기
이차원 배열의 크기라는 말이 뭔가 어색하다.
먼저 numarr[4][3]을 초기화했다고 생각해보자.
이 상태에서 sizeof(numarr)을 하게 되면 48이 반환된다.
그 이유는 이미 저 배열 안에는 12개의 요소들이 존재하고, 각 요소들의 크기는 4byte이기 때문이다.
#include <stdio.h>
int main()
{
int numArr[3][4] = {
{ 11, 22, 33, 44 },
{ 55, 66, 77, 88 },
{ 99, 110, 121, 132 }
};
printf("%d\n", sizeof(numArr));
int col = sizeof(numArr[0]) / sizeof(int);
int row = sizeof(numArr) / sizeof(numArr[0]);
printf("%d\n", col); // 4
printf("%d\n", row); // 3
return 0;
}
이 코드를 가지고 분석해보자.
먼저 numArr은 행의 크기가 4, 열의 크기가 3이다.
요소는 총 12개이므로 첫번째 printf에서 48이 출력될 것이다.
두 번째 printf를 보자 col이라는 변수에 numArr의 첫 번째 행의 크기를 계산하고 int의 크기로 나눈 값을 집어넣었다.
즉 한 행에 속하는 원소들의 갯수를 집어넣은 것이다.
세 번째 printf도 약간 비슷하게 전체 numArr의 크기를 구하고, 한 행의 크기로 나누었다. 즉 열의 갯수를 구한 것이다.
📖UNIT38
📒포인터와 배열 응용하기
#define _CRT_SECURE_NO_WARNING
#include <stdio.h>
int main()
{
int size;
scanf("%d", &size); // 배열의 크기를 입력받음
int numArr[size]; // GCC에서는 사용 가능, Visual Studio 2015에서는 컴파일 에러
return 0;
}
이렇게 입력을 받아서 그만큼 배열을 만드는 방법은 VS2015에서 에러를 발생시킨다고 한다.
GCC, Clang에서는 지원한다는 것을 보면 지원을 할 지도 ...?
📒포인터에 할당된 메모리를 배열처럼
위의 상황에 대한 해답을 찾기 위해 포인터를 사용하자.
음 그러니까 malloc을 할 때, 변수 하나만 지정해주는 것이 아니라 그 크기를 엄청 많이 해주면 될 것 같다.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *numPtr = malloc(sizeof(int) * 10);
numPtr[0] = 10;
numPtr[9] = 20; // 배열처럼 인덱스로 접근하여 값 할당
printf("%d\n", numPtr[0]); // 배열처럼 인덱스로 접근하여 값 출력
printf("%d\n", numPtr[9]); // 배열처럼 인덱스로 접근하여 값 출력
free(numPtr); // 동적으로 할당한 메모리 해제
return 0;
}
결국 numPtr은 하나의 배열이 된 것이다. sizeof(int) * 10의 코드 전에 값을 입력받아 10 대신 사용할 수도 있다.
그럼 사용자가 입력한 크기 만큼의 배열이 선언되겠지.
📒포인터에 할당된 메모리를 2차원 배열로
먼저, 세로크기의 메모리를 할당해야 한다. (세로를 할당하게 되면 인덱싱을 통해서 각 요소들에 또 배열을 추가할 수 있기때문)
이렇게 세로크기의 메모리를 할당하게 된다면 반복문을 통해서 각 열마다 행을 추가시켜주면 된다.
처음 세로크기의 메모리를 선언할 때는 이중 포인터로 선언해주어야 한다.
그래야 그 안에 또 포인터를 만들 수 있으니.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int **m = malloc(sizeof(int *) * 3);
for (int i = 0; i < 3; i++)
{
m[i] = malloc(sizeof(int) * 4);
}
m[0][0] = 1;
m[2][0] = 5;
m[2][3] = 2;
printf("%d\n", m[0][0]);
printf("%d\n", m[2][0]);
printf("%d\n", m[2][3]);
for (int i = 0; i < 3; i++)
{
free(m[i]);
}
free(m); // 2차원 배열의 세로 공간 메모리 해제
return 0;
}
이렇게 마지막에 free까지 해주면 완벽할 것이다.
만약 입력받은 값으로 진행하고 싶다면 malloc 내에서 * 3, * 4를 입력받은 두 값으로 진행해주면 된다.
'스터디 그룹 > ProjectH4C' 카테고리의 다른 글
ProjectH4C 2개월 4주차 과제 (해커스쿨 ftz) (0) | 2021.03.12 |
---|---|
ProjectH4C 2개월 3주차 과제 (포인터 5문제) (0) | 2021.03.07 |
ProjectH4C 2개월 3주차 과제 ( UNIT34, 35) (0) | 2021.03.03 |
ProjectH4C 2개월 2주차 과제 - 10문제 write-up (0) | 2021.02.26 |
ProjectH4C 2개월 1주차 과제 C & Python (2) | 2021.02.20 |