배열을 쓰는 이유
배열은 같은 자료형의 변수를 일렬로 늘어놓은 형태이며, 반복문과 결합하면 연속적이고 반복되는 값을 쉽게 처리할 수 있다.
배열을 선언하고 요소에 접근하기
배열은 변수 이름 뒤에 []를 붙인 뒤 크기를 설정한다. 그리고 배열을 선언하면서 값을 초기화할때는 {}를 사용한다.
- 자료형 배열이름[크기];
- 자료형 배열이름[크기] = {값, 값, 값};
여기서 배열 크기와 배열 인덱스가 다르다.
배열 인덱스가 0부터 시작하는 이유는 메모리 주소가 0부터 시작하기 때문이다.
배열의 이름도 포인터이므로 인덱스가 0부터 시작하면 요소 접근과 포인터 연산이 일치하게 된다.
하지만 배열의 인덱스는 절대적인 기준은 아니며 언어의 구현에 따라 달라질 수 있다.
배열을 0으로 초기화하기
배열의 모든 요소들을 간단하게 0으로 초기화해보자.
- 자료형 배열이름 크기[ ] = {0, ];
배열의 요소에 값 할당하기
배열은 []로 요소에 접근한 뒤 값을 할당할 수 있다.
- 배열[인덱스] = 값;
그렇다면 배열의 범위를 벗어난 인덱스에 접근하면 어떻게 될까?
쓰레기 값이 나온다.
배열의 크기 구하기
int main()
{
int numArr[10] = { 11,22,33,44,55,66,77,88,99,110 };
for (int i = 0; i < 10; i++)
{
printf("%d\n", numArr[i]);
}
return 0;
}
하지만 코드를 다 작성했는데 배열의 크기를 15개로 늘려야 하는 상황이 발생했다.
그래서 배열의 크기를 15로 늘렸지만 실수로 반복문의 조건식은 수정하지 못했다.
int main()
{
int numArr[15] = { 11,22,33,44,55,66,77,88,99,110,121,132,143,154,165};
for (int i = 0; i < 10; i++) // 앗 수정을 못했다!
{
printf("%d\n", numArr[i]);
}
return 0;
}
이런 경우 버그가 발생하게된다.
여기서는 수정할 부분이 두곳이지만 반복문이 여러 개로 늘어나면 실수할 가능성은 그만큼 높아진다.
실수를 방지하기 위해서는 배열의 크기가 바뀌었을 때, 배열의 크기를 알아서 계산하도록 만들면 된다.
반복문으로 배열의 요소를 역순으로 출력해보자.
배열의 요소 합계를 구해보자.
배열의 요소에 저장된 값을 두 배로 만들기
배열을 포인터에 넣기
배열은 첫 번째 요소의 주솟값만 담고 있다.
즉, 배열은 주솟값이기 때문에 포인터에 넣을 수 있다.
따라서 다음과 같이 포인터에 배열을 넣은 뒤 포인터에서 인덱스로 요소에 접근할 수 있다.
int *numPtr = numArr; 처럼 배열을 포인터에 바로 할당할 수 있다.
단 자료형이 같아야 하며 1차원 배열이라면 *가 한 개인 단일 포인터라야 한다.
배열을 포인터에 할당한 뒤 포인터를 역참조해보면 배열의 첫 번째 요소의 값이 나온다.
마찬가지로 배열 자체도 역참조해보면 배열의 첫번쨰 요소의 값이 나온다.
배열과 포인터가 다른 점은 sizeof로 크기를 계산했을 때 뿐이다.
배열에 sizeof 연산자를 사용하면 배열이 차지하는 전체 공간이 출력되지만
sizeof로 배열의 주소가 들어있는 포인터의 크기를 구해보면 그냥 포인터의 크기만 나온다.
배열을 활용하여 10진수를 2진수로 만들기
문제는 있는데 답을 내 맘대로 만들어봤다.
되긴하더라.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int decimal; //10진수
int position = 0; //자릿수
printf("10진수를 입력하세요. : ");
scanf("%d", &decimal);
int binary[30] = { 0, }; //배열 생성
for (binary[position]; decimal > 0; position++) //2진수배열(자릿수 0)부터 시작; 입력된 10진수가 0보다 클때까지 반복; 자릿수는 1씩 증가
{
binary[position] = decimal % 2; //입력된 10진수의 2로 나눈 나머지값이 2진수배열[자릿수]에 할당됨.
decimal = decimal / 2; //10진수에는 2로 나눈 값을 할당함. 조건이 맞다면 (10진수가 0보다 크다면) 다음 루프를 진행함.
} //for문 탈출 시, 루프는 변화식이 하나 더 진행된 후 마무리되므로 position은 하나 증가해있음
printf("\n변환결과\n");
for (int i = position - 1; i >= 0; i--) // position이 하나 늘어난 후 진행되므로 하나 줄여줌. 배열은 0까지 있으므로 i는 0까지.
{
printf("%d", binary[i]);
}
return 0;
}
굳이다아아아
'C, C++' 카테고리의 다른 글
C언어 코딩도장(2차원 배열 사용하기) (0) | 2022.04.30 |
---|---|
C언어 코딩도장(배열: 가장 작은 수 출력하기) (0) | 2022.04.29 |
C언어 코딩도장(메모리 사용하기) (0) | 2022.04.29 |
C언어 코딩도장(포인터 사용하기) (0) | 2022.04.29 |
[C언어] 약수 구하기 (0) | 2022.04.28 |