본문 바로가기

프로그래밍/C 기초

(49)
[C언어 강좌] #49 구조체 오늘의 강의 내용은 제목에도 쓰여있듯이 구조체입니다. 구조체는 여러가지 변수를 묶어서 하나의 타입을 정의하는 것입니다.int , float , double , char 등등 여러가지 자료형처럼 새로운 자료형을 하나 만드는 것입니다. 다만 형태가 지금까지 배웠던 기본 자료형들과는 다릅니다.배열이 여러개의 변수를 한번에 선언할 수 있듯이 자료형도 여러개의 변수를 한번에 만들 수 있습니다.int형 배열, float형 배열같은것 처럼 배열은 하나의 타입만을 여러개 만들었지만, 구조체는 여러개의 타입을 한번에 만들 수 있습니다.또한 그 타입마다 이름을 붙일 수 있고, 새로운 자료형으로써 사용 가능합니다. 예제를 보면 금방 이해가 될 것입니다. - 구조체 선언 구조체를 선언하는 방법은 다음과 같습니다. 123456..
[C언어 강좌] #48 함수 포인터 제목에서도 알 수 있듯이 이번 주제는 함수 포인터입니다.함수 포인터라는 이름만 들어도 딱 감이 오시겠지만, 함수포인터는 함수를 가리키는 포인터입니다. 변수만 메모리 공간에 저장되는 게 아니고 함수도 메모리 공간에 저장돼서 호출 시 실행이 됩니다.그렇다면 함수도 메모리 공간에 있으니 당연히 메모리 주소도 존재한다는 뜻이겠죠? 배열의 이름이 배열의 시작주소 값을 나타내는 것 처럼 함수의 이름도 메모리 공간의 주소를 나타냅니다. 123456789#include int add(int a,int b) { return a+b;}int main (void) { printf("%d",add);}cs 두 변수를 더해서 값을 반환하는 add함수를 만들고 함수명을 적어서 출력해봤습니다.출력결과는 add함수의 주소 값이 출력..
[C언어 강좌] #47 배열포인터 배열포인터에 대해 알아봅시다.우선 배열포인터는 포인터배열과는 다른겁니다.이름이 비슷해서 헷갈릴수 있죠. 포인터배열은 저번에도 말했듯이 포인터변수를 담을수 있는 배열입니다.그에비해 이번에 배울 배열포인터는 배열을 가리키는 포인터변수입니다. 사실 근데 배열 이름은 첫번째 원소의 주소를 가리키고있는 상수 포인터라고 배운적이 있잖아요? 그래서arr[i]*(arr+i)이 둘은 같다고 볼수있죠. 배열포인터라는건 결국 그 포인터 상수를 가리키는 포인터라고 볼수 있기때문에 이중포인터라고도 볼수 있습니다.이중포인터에 대해서는 저번 46강에서 설명해드렸었죠. 배열포인터는 보통 다차원배열에 접근할때 쓰입니다. 12345678#include int main(void) { int arr[2][3] = {{0,1,2},{3,4,..
[C언어 강좌] #46 다중 포인터 안녕하세요. 오랜만에 C언어강좌를 다시 써보네요.한 3~4달정도 블로그 포스팅을 쉰것같습니다.오랜만에 써서 갑자기 강좌가 좀 다른느낌이 들수도 있습니다. 양해 부탁드려요 ㅋㅋ 예전 강좌까지는 이미지를 통해서 코드를 보여드렸었는데 굳이 그럴 필요 없었더라고요.12345#include int main(void) { printf("HelloWorld");} cs앞으로는 이런 방식으로 예시를 보여드릴수 있겠습니다.그리고 예전에는 1일에 한개씩 글을 썼지만 이제는 그렇게까지는 못쓸것같네요.조금 불규칙적으로 글을 작성하게 될것같습니다. 그래도 시간날때마다 틈틈히 써보도록 할게요. 아무튼 여기까지는 잡소리였고 강좌 시작하겠습니다.이번에 배워볼 내용은 다중 포인터라는 개념인데요. 말만 들어도 감이 오지않나요?다중포인터..
[C언어 강좌] #45 포인터 배열 포인터 배열에 대해 설명해보겠습니다.포인터를 선언할때도 다른 변수들과 마찬가지로 배열로 선언이 가능합니다.그것을 포인터 배열이라고 하는데 다른 변수들의 배열을 선언할때와 마찬가지로 포인터 배열은 한번에 여러개의 포인터변수를 선언할수 있습니다. 위 예제처럼 해주시면 포인터 배열 선언이 가능합니다.배열 원소 3개에 각각 포인터변수가 있고 포인터변수는 각자 다른 주소들을 넣을수 있습니다. 그리고 각각 가진 주소값을 참조하려면 *연산자가 두번 필요합니다.포인터배열인 arr도 결국 배열의 시작 주소를 담고있는 상수포인터이기때문에 각각 원소에 접근하려면 *연산자를 사용해야하고그 원소에 있는 주소값으로 한번더 접근하려면 *를 또 사용해줘야합니다. 위 예제처럼 배열방식으로 둘다 접근해도 정상적으로 작동하고 *연산자와 ..
[C언어 강좌] #44 동적할당 malloc , free 안녕하세요! 저번편까지는 분명 포인터를 설명하고있었는데 갑자기 이상한놈들이 튀어나왔네요.하지만 이녀석들은 메모리와 많이 관련되있는것들이기 때문에 메모리 주소를 담는 포인터와도 연관이 꽤 있습니다.그래서 포인터를 설명하다말고 malloc이라는것을 설명해드리려합니다. 동적할당은 전역변수나 지역변수와 달리 프로그램이 실행되고 있는 도중에 메모리 공간을 할당할수 있는것입니다. 우선 malloc을 사용하기 위해서는 stdlib.h 라는 헤더파일을 포함해주셔야 합니다.standard library ( 표준 라이브러리 ) 의 약자입니다. 위와같이 stdlib.h를 포함하신후 malloc( 크기 ) 를 호출해주시면 그 크기만큼 메모리 공간을 할당해주고 할당된 메모리공간의 주소를 반환합니다. 그래서 int형 포인터를 만..
[C언어 강좌] #43 배열과 포인터-2 이번편에서는 배열과 포인터에 대해서 설명하지 못한부분을 마저 설명해드리겠습니다.42편과 이어지는 내용이므로 먼저 봐주세요. 배열은 상수형태의 포인터라고 저번편에서 설명해드렸습니다. 근데 배열을 참조할때는 뒤에 [i] 를 붙여서 참조합니다.그리고 배열은 상수형태의 포인터죠. 포인터에도 똑같이 사용할수 있을겁니다.결국 포인터 뒤에 [i]를 붙이면 해당 주소를 참조할수 있다는 얘기가 됩니다. *연산자를 쓰지 않고 배열처럼 참조해봤습니다.[0]은 해당 주소에서 0만큼 이동한다는 얘기니까 결국 그 주소를 참조하는게 됩니다.그래서 *연산자를 이용했을때와 같은결과가 나왔습니다. 이렇게 배열의 첫번째 주소를 담을경우포인터변수인 p를 배열처럼 사용하는것도 가능합니다. 포인터를 배열처럼 쓸수 있지만 배열을 포인터처럼 사용..
[C언어 강좌] #42 배열과 포인터 이번에는 배열과 포인터의 관계에 대해서 설명해드리겠습니다.저번에 배열에 대해 설명해드릴때 주소값과 연관지어서 설명을 많이 드렸었죠. arr[사실 배열은 상수 포인터라고 보시면 됩니다. 위처럼 arr이라는 배열을 선언했을때 arr은 가장 낮은번지의 주소값을 담고있는 상수 형태의 포인터입니다. arr의 출력결과를 보시면 실제로 주소값을 담고있다는걸 알수있죠. arr은 &arr[0]의 주소값과 같습니다. 즉 arr이라는 포인터 상수는 그 배열에서 가장 낮은번지의 주소값을 가리키고있을 뿐입니다. 그리고 arr[i]에서 i * 자료형의 크기 만큼 주소값을 증가시켜서 그곳에 접근하는것입니다. 그리고 위에서 말씀드렸듯이 상수입니다.대입은 불가능합니다.