C언어 다차원 배열 초기화
C언어 다차원 배열 초기화 2차원 배열은 행과 열의 형태로 생성되지만 메모리상에는 1차원과 같이 순서대로 할당되는 걸 지난 글에서 확인했었는데요. 이번에는 다차원 배열을 초기화하는 방법을 정리해볼까 합니다. 이 방법은 몇 가지가 있지만 기본 형식은 1차원과 비슷한데요. 먼저 1차원 배열을 잠깐 살펴보겠습니다. int aaa[]={1, 2, 3 }; 이렇게 초기화 리스트 안에 입력한 순서대로 데이터가 할당되고 선언한 배열의 수와 초기화한 값이 다를 때는 나머지는 '0'이 대입됩니다. int bbb[5]={1, 2, 3}; ◀▶ int bbb[5]={1, 2, 3, 0, 0}; 1차원 배열을 공부하셨다면 이 두 가지 경우가 같다는 건 아실 겁니다. 2차원 배열 정리한다고 해놓고 왜 이렇게 1차원 이야기를 하..
C언어 다차원 배열 메모리 할당 형태는?
C언어 다차원 배열 메모리 할당 지난 글에서 다차원(2차원) 배열은 가로와 세로 형태로 배열이 생성되는 걸 확인했었는데요. 그렇다면 이 데이터들이 메모리에 저장될 때는 어떻게 할당 될까요? 컴퓨터의 메모리는 1차원 구조이기 때문에 2차원 배열의 형식으로 데이터를 저장하지는 못하고 순서대로 1차원 구조로 저장됩니다. 예를 들어 다음과 같은 2차원 배열이 있다고 가정해볼게요. int arr[3][2]; 이 배열은 3행 2열의 형태로 배열이 생성되지만 메모리상에는 int arr[0][0], int arr[0][1]..... int arr[2][1] 순서대로 메모리에 저장됩니다. 이 내용을 확인해보기 위해서 간단한 예제를 만들어보겠습니다. 2차원 배열을 선언하고 각 요소의 메모리 주소값을 출력해보는 예제입니다...
C언어 독학 다차원 배열
이번 글에서는 C언어의 다차원 배열의 기본 개념을 정리해볼까 합니다. 1차원 배열은 같은 자료형을 메모리상에 한 줄로 연속으로 나열하는 방식으로 데이터를 저장해서 관리를 용이하게 해주는 역할을 하는데요. 다차원 배열(일반적으로 2차원 배열)은 가로와 세로로 데이터를 저장하게 됩니다. 아파트 구조를 생각하면 이해하는데 도움이 좀 될 겁니다. 3층짜리에 각 층마다 2가구가 산다면 3행(층) 2열(가구)가 되겠죠? C언어에서 다차원 배열도 같은 형식으로 저장이 되고 2차원 배열의 선언 형식은 다음과 같습니다. int apt[3][2]; 이렇게 2차원 배열을 선언하면 세로가 3, 가로가 2인 2차원 배열이 되는 건데요. apt[0][0] apt[0][1] apt[1][0] apt[1][1] apt[2][0] a..
c언어 독학 const
c언어 독학 const 이번 글에서는 C언어 const를 포인터 변수에 선언하는 개념을 정리해볼까 합니다. const는 어떤 값이 변경되지 못하도록 상수로 선언하는 건데요. 포인터 변수에도 똑같이 적용할 수 있습니다. 포인터 변수를 이용하면 변수에 저장된 값도 변경할 수 있고, 포인터 변수에 저장된 변수의 주소 값도 변경할 수 있는데 이런 것들을 못하게 막아버리는 것입니다. 먼저 포인터에 저장된 변수의 주소 값을 변경하는 경우입니다. ▲ 예제에서는 int형 변수 x, y를 선언하고 각각 100과 200으로 초기화하고 있으며 포인터 변수 aa를 선언해서 그곳에 x의 주소 값을 저장하고 있습니다. 그리고 바로 이어서 aa에 x대신 y의 주소 값을 대입하고 있으며 결과가 제대로 출력이 되는 걸 확이할 수 있습..
C언어 프로그램 함수 호출 방식
C언어 프로그램 함수 호출 방식 C언어에서 어떤 기능을 실행하기 위해서 함수를 호출할 때 단순하게 이름으로 호출해서 그 안에 포함된 내용만 실행하도록 하는 경우도 있지만 어떤 값들을 전달하면서 호출하고 전달된 값을 이용해서 프로그램을 실행하게 하는 경우도 있는데요. 이렇게 값을 전달하면서 호출하는 방식은 두 가지가 있습니다. 첫 번째는 데이터를 전달하는 방식이구요.(Call-by-vlaue) 두 번째는 지난 글에서 알아봤던 데이터의 주소 값(Call-by-reference)을 전달하는 방식입니다. 예제를 만들면서 어떤 때 사용되는지 확인해보겠습니다. 먼저 단순하게 값을 전달하는 방식입니다. ▲ main() 에서 두 개의 변수를 선언한 후 각각 100과 200으로 초기화 한 후 aaa() 를 호출하면서 그..
C언어 독학 배열을 인자로 전달하기
C언어 독학 배열을 인자로 전달하기 배열이란 같은 자료형을 여러 개 모아 놓은 데이터의 형식인데요. 이 데이터를 함수에 인자로 전달할 수 있을까요? 지금까지 공부하면서 정리했던 대로 배열의 이름은 포인터 변수와 와 똑같은 역할을 하기 때문에 배열의 이름을 인자로 전달하면 그 배열의 첫 번째 요소의 주소 값이 전달됩니다. 하지만 함수에서는 매개변수로 배열을 사용할 수 없기 때문에 난관에 부딪치게 되는데요. 이때 매개변수에 포인터 변수는 사용할 수가 있습니다. 즉 배열로 전달하고 포인터 변수로 받아서 그 주소 값을 찾아가면 되는 거예요. 포인터 변수와 배열은 모두 변수의 메모리상의 주소 값을 저장하는 역할을 하기 때문에 가능한 것입니다. 말이 좀 어렵네요. ㅎㅎ 그래도 배열을 전달하고 포인터 변수로 받으면 ..
C언어 프로그래밍 인자로 전달되는 값
C언어 프로그래밍 인자로 전달되는 값은 복사 값 C언어에서 함수를 호출할 때 어떤 데이터를 넘겨주면서 그것을 대입해서 함수를 실행하도록 하는 경우 전달되는 값을 인자라고 하는데요. 함수에는 같은 같은 자료형의 변수... 즉, 매개변수에 그 값을 저장했다가 이용하게 됩니다. 다음 예제에서 이 개념을 확인해보겠습니다. ▲ main() 함수에서 int형 변수 su1과 su2를 선언과 초기화 한 후 hap()이라는 함수를 호출하면서 그 값을 전달하고 있습니다. 그리고 호출되는 함수에서는 두 값을 받아서 더해서 출력하고 있는 내용입니다. 이렇게 값을 전달하고 받아서 함수를 실행하게 되는데..... 여기서 중요한 내용은 hap()을 호출하면서 전달한 값 su1과 su2입니다. 이 녀석들은 정말로 su1과 su2에 ..
C언어 프로그램 포인터 배열
C언어 프로그램 포인터 배열 ■ 포인터도 변수이다. 데이터가 저장된 메모리의 주소를 저장하는 변수이기 때문에 포인터도 배열을 선언할 수 있으며 선언 방식은 다음과 같다. int * aaa[10]; double * bbb[20]; 이렇듯 선언하는 방법은 일반 변수의 배열을 선언하는 방법과 같다. 이렇게 배열로 선언된 포인터를 이용하는 예제를 간단히 만들어본다. ▲ int형 변수 su1~su4까지 각각 값들을 초기화하고 이 변수들의 주소 값을 저장할 arr 포인터 변수의 배열을 선언하고 있으며 각 주소 값으로 초기화 하고 있다. 그리고 * 연산자로 각각의 요소에 접근해서 저장된 값을 출력하고 있는 내용인데 프로그램을 실행하면 각각의 변수에 저장된 값이 순서대로 출력되는 걸 확인할 수 있다. 이처럼 포인터도 ..
C언어 프로그램 문자열과 포인터
C언어 프로그램 문자열과 포인터 ■ 문자열을 선언하는 일반적인 방식은 다음과 같이 배열에 char 변수를 저장하는 방법일 것이다. char ch[]="Hello!"; 이때 배열의 길이는 자동으로 초기화되기 때문에 신경 쓰지 않아도 되고,이는 변수들을 모아놓은 배열이다. 그렇기 때문에 그 변수에 저장된 값들을 변경할 수가 있는데 간단하게 확인해본다. ▲ 먼저 ch 배열로 문자열을 저장한 후 출력하고 있으며 문자열의 여섯 번째 요소 ch[5]='!'에 접근해서 그 값을 '?'로 변경하고 있는데 프로그램 실행 결과를 보면 정상적으로 그 값이 바뀐 걸 확인할 수 있다. 이처럼 배열을 이용한 문자열은 저장된 값의 변경이 가능하다. 하지만 이번 글에서 알아볼 포인터는 그 안에 저장된 문자열 값을 변경하지 못한다는 ..
C언어 독학 포인터 연산
C언어 독학 포인터 연산 포인터는 변수의 메모리 주소를 저장하는 것입니다. 그렇다면 이 포인터 변수를 증가 또는 감소하면 어떻게 될까요? 포인터 변수에 저장된 건 메모리 주소이기 때문에 해당 자료형의 크기만큼 증가 또는 감소하게 되는데요. 예를들어 int형 포인터라면 1을 더하면 4byte 만큼 값이 변경 되는 것입니다. 예제에서 확인해볼게요. ▲ 요소가 세 개인 int형 배열 a를 선언하고 각각의 값을 초기화하고 있으며 포인터 변수 b에 그 주소를 저장하고 있습니다. 그리고 그 주소를 확인하기 위해서 printf() 함수로 주소를 출력하고 있는데요. 0015F9E4 이네요. 그리고 이 주소를 저장하고 있는 포인터 변수 b에 +1을 해봤습니다. 그랬더니 정확하게 4byte가 증가하는군요. 이 4byte가..
c언어 프로그래밍 1차원 배열 이름을 대상으로 한 * 연산
c언어 프로그래밍 1차원 배열 이름을 대상으로 한 * 연산 ■ 지난 글에서 배열의 이름은 포인터 형이라는 걸 확인해봤었는데요. 둘이 같다면 배열 이름을 대상으로도 *연산을 할 수도 있고 반대로 포인터를 배열의 이름처럼 사용해서 그 요소에 접근할 수 있다는 의미인데요. 그 과정들을 예제로 살펴보겠습니다. 먼저 배열 이름을 대상으로 *연산을 하는 과정입니다. ▲ int형 배열 a와 double형 배열 b를 각각 선언하고 값을 초기화하고 있는데요. a와 b에 *연산자로 접근하고 있습니다. 지난 글에서 배열의 이름은 첫 번째 요소 [0]의 주소값을 저장한다고 했었는데요. *연산자로 그 자리에 접근해서 저장된 값들을 출력하고 있는 모습입니다. 10과 10.1이 출력되겠죠? 확인해보겠습니다. ▲ 예상했던 값이 출력..
C언어 독학 배열 이름은 포인터이다
C언어 독학 배열 이름은 포인터이다 ■ 배열은 같은 자료형의 데이터를 메모리에 연속으로 저장하는 것이고 포인터는 특정 변수의 메모리상의 주솟값을 저장하는 것인데요. 글의 제목처럼 배열 이름이 포인터라면 배열도 값이 저장된 메모리의 주솟값을 저장하고 있다는 의미겠죠? 다음 예제를 통해서 그 결과를 확인해보겠습니다. ▲ a [] 배열에 int형 자료형 세 개를 저장하고 있는데요. 서식 문사 "%p"를 이용해서 각 요소들의 값을 출력해보겠습니다. 그리고 배열의 이름 a의 값도 출력해볼게요. ▲ 이 프로그램의 실행 결과에서 알 수 있듯이 배열의 이름이 가리키고 있는 주소와 배열의 첫 번째 요소가 가리키고 있는 주소의 위치가 같습니다. 즉, 배열의 이름은 저장된 메모리의 첫 번째 요소의 주소값을 저장하고 있다는 ..
c언어 독학 포인터 변수의 초기화
c언어 독학 포인터 변수의 초기화 ■ 어떤 변수든 선언할 때 또는 나중에 값을 넣어서 초기화를 해줘야 하는데요. 다른 변수에 비해서 포인터 변수는 이 초기화에 특히 주의를 해야 합니다. 이 녀석을 이용하면 메모리의 특정 주소에 직접 접근할 수도 있고 그곳에 저장된 값을 변경할 수도 있기 때문인데요. 만약에 포인터 변수를 초기화하지 않고 값을 대입해버리면 어떤 결과가 나올까요? 예제에서 확인해볼게요. ▲ int 변수 x를 선언하고 100으로 초기화 한 후 int형 포인터 변수 aa를 선언하고 초기화를 하지 않은 상태에서 *aa를 이용해서 aa가 가리키고 있는 메모리에 200을 대입하고 있습니다. 그리고 그곳에 *aa에 200이 제대로 대입됐는지 확인하기 위해서 값을 출력하고 있는 모습입니다. 이 프로그램은..
c언어 프로그래밍 포인터 변수 선언과 &, * 연산자의 역할
■ C언어에서 변수를 선언하면 메모리의 어느 한 곳에 위치하게 되는데 그곳의 주소를 가져와서 저장할 수 있는 것이 포인터 변수입니다. 이 포인터 변수를 이용하면 메모리에 저장된 변수의 값에 접근할 수도 있고 변경할 수도 있습니다. 이때 사용되는 연산자들이 있는데 변수의 값이 저장된 메모리 주소를 반환하는 연산자가 "&"이고, 그 변수의 주소에 직접 접근할 수 역할을 하는 게 "*" 연산자 입니다. 예제에서 이것들을 이용해보겠습니다. 먼저 포인터 변수를 선언할 건데요. 선언 방법은 다음과 같습니다. 자료형 * 포인터 변수 이름; ▲ int형 변수 aa를 선언하고 100으로 초기화하고 있는데요. 이 변수의 주소값을 저장할 포인터 변수 pa를 형식에 맞게 선언하고 있습니다. 이제 pa에 aa의 주소를 저장하겠..
c언어 독학 포인터 변수
■ c언어에서 포인터 변수도 어떤 값을 저장하기 위한 변수의 한 종류인데 여기에는 다른 변수의 메모리 주소값이 저장됩니다. 일단 이렇게 개념을 잡고 예제에서 int형 변수를 하나 선언하고 초기화 한 후 그 값이 저장된 메모리의 주소값을 불러와서 포인터 변수에 저장하고 출력하는 과정을 통해서 포인터 변수를 알아보겠습니다. ▲ int x를 선언하고 10으로 초기화하고 있고, [int * a=&x;]로 int형 포인터 변수 a를 선언하고 그 값을 x의 주소값을 불러와서 초기화하고 있는데요. 포인터를 선언하는 방법은 그림과 같이 [자료형 * 포인터 이름] 형식입니다. 그리고 거기에 저장될 주소값을 불러올 때는 "&'연산자를 사용합니다. 이렇게 선언하고 초기화한 a에 저장된 메모리 주소값을 출력하기 위한 서식 문..
c언어 프로그래밍 scanf 함수로 문자열 입력
c언어 프로그래밍 scanf 함수로 문자열 입력 ■ c언어에서 데이터를 입력받는 함수 중 하나가 scanf()인데요. 이 녀석을 이용해서 정수를 입력받을 때는 다음 예제와 같이 저장할 변수 앞에 "&"를 붙여줘야 합니다. ▲ 정수를 입력받아서 'x' 변수에 저장하고 있는 과정인데 이렇게 x에 정수를 저장하기 위해서 "&"연산자를 붙이고 있습니다. 하지만 문자열을 입력받을 때는 "&" 연산자를 붙이지 않습니다. 좀 더 자세한 내용은 포인터 정리할 때 다시 언급하기로 하고 일단 이렇게 암기하고 넘어갈게요. c언어에서는 문자열을 출력할 때 서식 문자 "%s"를 이용하듯이 입력받을 때도 마찬가지 입니다. 예제를 만들어서 확인해보겠습니다. ▲ 길이가 50인 char 배열 str을 선언하고 있으며 문자열을 입력받기..