1차원 배열은 단일 포인터에 넣을 수 있었다. 그렇다면 2차원 배열은 이중 포인터에 넣을 수 있을까? 컴파일을 하면 오류는 안나지만 아무 값도 안나온다. 2차원 배열을 포인터에 담으려면 다음과 같은 특별한 방법이 필요하다. 자료형(*포인터이름)[가로크기]; 즉, 포인터를 선언할 때 *와 포인터 이름을 괄호로 묵어준 뒤 []에 가로 크기를 지정한다. int (*numPtr)[4]; 풀어서 설명하면 가로 크기가 4인 배열을 가리키는 포인터라는 뜻이다. int *numPtr[4]는 int형 포인터 4개를 담을 수 있는 배열이라는 뜻이다. 즉, 괄호가 있으면 배열을 가리키는 배열 포인터, 괄호가 없으면 포인터를 여러개 담는 포인터 배열이다. int num1, num2, num3, num4; int *numPt..
평면 구조의 2차원 배열에 대해 알아보자. 2차원 배열은 가로x세로 형태로 이루어져있으며, 행과 열 모두 0부터 시작한다. 2차원 배열을 선언하고 요소에 접근하기 2차원 배열은 [ ] (대괄호)를 두번 사용하여 선언하며 첫번째 가로에는 세로 크기, 두번째 대괄호에는 가로크기를 지정한다. 일반적으로 2차원 공간은 가로x세로로 표기하지만 배열로 만들때는 세로x가로로 표현한다. 자료형 배열이름[세로크기][가로크기]; 자료형 배열이름[세로크기][가로크기] = {{값, 값, 값}, {값, 값, 값}}; 아래는 세로크기가 3, 가로크기가 4인 int형 2차원 배열을 선언하는 방법이다. #include int main() { int numArr[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9..
배열을 쓰는 이유 배열은 같은 자료형의 변수를 일렬로 늘어놓은 형태이며, 반복문과 결합하면 연속적이고 반복되는 값을 쉽게 처리할 수 있다. 배열을 선언하고 요소에 접근하기 배열은 변수 이름 뒤에 []를 붙인 뒤 크기를 설정한다. 그리고 배열을 선언하면서 값을 초기화할때는 {}를 사용한다. 자료형 배열이름[크기]; 자료형 배열이름[크기] = {값, 값, 값}; 여기서 배열 크기와 배열 인덱스가 다르다. 배열 인덱스가 0부터 시작하는 이유는 메모리 주소가 0부터 시작하기 때문이다. 배열의 이름도 포인터이므로 인덱스가 0부터 시작하면 요소 접근과 포인터 연산이 일치하게 된다. 하지만 배열의 인덱스는 절대적인 기준은 아니며 언어의 구현에 따라 달라질 수 있다. 배열을 0으로 초기화하기 배열의 모든 요소들을 간단..
포인터에 원하는 만큼 메모리 공간을 할당받아 사용하는 방법을 알아보자. 메모리는 malloc → 사용 → free 패턴으로 사용한다. 메모리 할당하기 메모리를 사용하려면 malloc 함수로 사용할 메모리 공간을 확보해야 한다. (malloc : memory allocate) 이때 필요한 메모리 크기는 바이트 단위로 지정한다. 메모리 할당, 해제 함수는 stdlib.h 헤더 파일에 선언이 되어있다. #include #include int main() { int num1 = 20; // int형 변수 선언 int* numPtr1; // numPtr1 포인터 변수 선언 numPtr1 = &num1; // num1의 메모리 주소를 numPtr1에 할당 int* numPtr2; // numPtr2 포인터 변수 선..
int num1 = 10; 위와 같은 변수는 컴퓨터 메모리에 생성된다. 즉 메모리에 일정한 공간을 확보해두고 원하는 값을 저장하거나 가져오는 방식이다. 보통 변수는 num1과 같이 이름으로 사용하지만 메모리의 특정 장소에 있으므로 메모리 주소로도 표현할 수 있다. 일상생활에서 집을 구분할때 주소를 사용하는 것과 같은 원리이다. 변수의 메모리주소를 구할때는 &(num1) 이런식으로 변수 앞에 &(주소 연산자)를 붙여준다. 메모리 주소는 printf에서 서식 지정자 %p를 사용한다. 포인터 변수 선언하기 변수의 메모리 주소를 구했는데 메모리 주소는 어디에 저장해야 할까? C언어에서 메모리 주소는 포인터(pointer) 변수에 저장한다. 포인터 변수는 *를 사용하여 선언한다. (포인터 변수는 줄여서 포인터로 ..
FizzBuzz는 매우 간단한 프로그래밍 문제이며, 규칙은 다음과 같다 1에서 100까지 출력 3의 배수는 Fizz 출력 5의 배수는 Buzz 출력 3과 5의 공배수는 FizzBuzz 출력 즉 컴파일하면 아래와 같은 화면이 나온다. FizzBuzz 첫 트라이 아래는 내가 문제만 보고 짠 코딩이다 #define _CRT_SECURE_NO_WARNINGS #include int main() { for (int i = 1; i
goto는 코딩 중 원하는 부분으로 건너뛰어야하는 상황에서 사용하는 제어문이다. goto는 별다른 제약 조건 없이 원하는 부분으로 이동할 수 있기 때문에 자칫 잘못하면 남발하여 사용할 수 있는데, 그렇게되면 코드가 너무 부해져 가독성이 떨어지게 된다. 하지만 적절히 사용하면 중복되는 코드를 없앨 수 있고, 코드를 좀 더 간결하게 만들 수 있다. goto와 레이블 사용하기 goto는 레이블을 지정해서 사용한다. goto 레이블; 레이블: #define _CRT_SECURE_NO_WARNINGS #include int main() { int num1; scanf("%d", &num1); if (num1 == 1) // num1가 1이라면 goto ONE; // ONE으로 goto else if (num1 =..
역피라미드, 피라미드, 모래시계형을 만들어볼 것이다. 역피라미드 만들기 Thinking - 공백의 패턴은 어떠한가? : 외부 for문 i가 증가하는 갯수만큼 공백 증가. - 별은 어떻게 나타낼 것인가? : 약간의 그림을 그려보고, 패턴을 찾는다. - 역 피라미드의 경우, 외부 for문 i가 0부터 시작하고, 높이가 h이라는 가정 하에 별의 갯수는 2*h-(2*i+1)이다. 이것을 가지고 코딩을 해보자. 더보기 #define _CRT_SECURE_NO_WARNINGS #include int main() { int h; scanf("%d", &h); for (int i = 0; i