본문 바로가기

전체 글

(64)
[C언어 강좌] #42 배열과 포인터 이번에는 배열과 포인터의 관계에 대해서 설명해드리겠습니다.저번에 배열에 대해 설명해드릴때 주소값과 연관지어서 설명을 많이 드렸었죠. arr[사실 배열은 상수 포인터라고 보시면 됩니다. 위처럼 arr이라는 배열을 선언했을때 arr은 가장 낮은번지의 주소값을 담고있는 상수 형태의 포인터입니다. arr의 출력결과를 보시면 실제로 주소값을 담고있다는걸 알수있죠. arr은 &arr[0]의 주소값과 같습니다. 즉 arr이라는 포인터 상수는 그 배열에서 가장 낮은번지의 주소값을 가리키고있을 뿐입니다. 그리고 arr[i]에서 i * 자료형의 크기 만큼 주소값을 증가시켜서 그곳에 접근하는것입니다. 그리고 위에서 말씀드렸듯이 상수입니다.대입은 불가능합니다.
[C언어 강좌] #41 void 포인터 이번에는 void형 포인터 시간입니다. 포인터 타입을 정할때 우리는 포인터가 가리킬 대상의 타입에 맞춰서 포인터를 선언해줬었습니다.하지만 void형포인터는 대상체가 정해져있지 않습니다. 대상체가 정해져있지 않다는말은 다른 자료형들처럼 특별히 하나의 자료형만 가리킬수 있는것이 아니라 모든 자료형을 가리킬수 있습니다.특별히 하나의 대상이 정해져있지 않습니다. 그럼 여기까지 봤을때는 "아그렇다면 어떤것이든 가리킬수 있으니 항상 void형 포인터를 쓰면 되겠네요!"라고 생각하실수도 있습니다. 하지만 우리가 포인터를 선언할때 타입을 지정해주는 이유가 무엇이였죠?대상을 참조할때 어느정도의 크기를 어떻게 읽어야하는지 가르쳐주는 역할을 하는것입니다.void포인터처럼 가리키는대상이 무엇인지 알수가 없으면 어떻게 참조해야..
[C언어 강좌] #40 NULL 포인터 오늘 강좌는 깜빡하고 조금 늦어버리고 말았네요 ㅋㅋㅋ어차피 시간맞춰서 꼬박꼬박 보는사람도 없을거라 생각하지만요. 아무튼 이번에는 NULL포인터입니다. 포인터를 처음 선언할때는 기본적으로 쓰레기값을 가지고있습니다.그래서 초기값을 넣어줘야하지요. 근데 선언만 해놓고 가리킬 공간이 딱히 없다면? 아니면 가리키던공간이 쓸모없는 메모리공간이 됐다면?포인터가 가리킬곳을 다시 정해줘야하는데 그럴 방법이 없죠.만약 포인터가 쓰레기값을 가지고있을때 그 포인터가 가리키고있는 메모리공간에 무언가를 하면 치명적인 일이 일어날지도 모릅니다.우연히 그 메모리공간이 프로그램에서 매우매우 중요한 메모리공간이였다면 치명적인 버그가 터질수 있습니다. 그럴때 사용되는것이 NULL포인터입니다.NULL은 stdio.h를 보면 이렇게 정의되어..
[C언어 강좌] #39 *p++ 포인터변수인 p에 *p++처럼 사용되는경우를 많이 볼수 있습니다.예제와 함께 배워봅시다. 배열 arr을 가리키고있는 포인텨변수 p를 선언하고 *p++를 통해 배열의 요소를 하나씩 출력해봤습니다. *연산자와 ++연산자는 우선순위가 같습니다. 하지만 우측이 우선적으로 계산되기때문에 ++가 먼저 연산됩니다.하지만 ++의경우에는 그 문장이 끝난 후에서야 값이 증가하죠. 그래서 *로 먼저 참조를 하고 출력이 끝난 후에서야 p의 값이 증가합니다. 하지만 (*p)++의 경우에는 전혀 다른식이 되버리죠. 이경우에는 먼저 p에 접근한후 p가 가리키고있는 곳의 값을 증가시킵니다.결국 포인터의 주소가 바뀌는게 아니고 포인터가 가리키고있는 값이 증가하게되버립니다. *p++의 경우에는 10,20,30,40,50이 순서대로 출력..
[C언어 강좌] #38 포인터끼리 연산 저번에 포인터연산에 대해 간단하게 알아봤었죠.포인터에 정수를 더하거나 뺄수 있습니다. 단 그것은 포인터의 자료형 크기만큼씩 증가하고 감소하는거였죠.이번엔 포인터끼리의 연산을 알아봅시다. 우선 포인터끼리의 덧셈입니다.결론부터 말하자면 이건 컴파일러에서 허용하지 않고 필요하지도 않습니다. 위처럼 포인터끼리 더하려하면 컴파일에러를 뿜어냅니다.p1과 p2의 합은 사실상 p1,p2와는 전혀 무관한 값이고 아무런 의미도 없는 주소입니다.이런경우 프로그래머의 실수인경우가 대부분이기때문에 컴파일러는 이것을 오류로 처리합니다. 하지만 포인터끼리의 뺄셈은 가능합니다.이것은 실제로 의미있는값이기도 합니다. 그것은 두 주소간의 거리를 의미하기 때문입니다.근데 여기서도 이상한일을 볼수 있습니다. 분명 결과는 4가 나와야할텐데...
[C언어 강좌] #37 포인터연산 이번에는 포인터 연산을 배워봅시다.메모리접근에 사용되는 *연산 이외에도 포인터에는 덧셈과 뺄셈도 가능합니다.하지만 여기서 중요한건 덧셈과 뺄셈이 가능하다는 사실이 아니라 일반 덧셈뺄셈과는 차이가 있다는것입니다. 포인터가 가리키고있는 주소에 +1을 해봤습니다.근데 출력결과를 보면 이상한일이 일어났네요. 분명 1을 증가시켰는데 출력결과를 보면 4가 증가했습니다. 눈치가 빠르신분들은 알겠지만 위 그림을 보면 +1을 할경우 int형범위를 4칸 뒤에있는 주소로 이동했습니다.int형이 4바이트기때문에 1을 증가시키면 주소값은 4가 증가되는것입니다.즉.여기서 알수있는것은 sizeof(자료형타입)만큼 이동한다는 소리입니다. num을 char형으로 바꾸고 sizeof를 했더니 1이 출력됐습니다. char의 크기는 1바이..
[C언어 강좌] #36 포인터 매개변수 하루 한편씩 꾸준하게 c언어 강좌를 올리려니 힘드네요.한달정도 이렇게 유지했더니 이제 분량좀 줄여야겠다는 생각이 들어서 이제부터 한편 분량이 좀 짧아질것같습니다. (사실 이미 짧았..읍읍)전엔 한편에 두세가지 내용을 넣었다면 이제 한편에 한내용정도만..안그래도 전부터 한편에 한가지 내용만 넣은적은 꽤 있었지만말입니다. 아무튼 오늘은 간단하게 포인터 사용의 예제를 보여드리겠습니다.포인터로 변수를 가리킬수 있는데 이걸 어디다쓰나요? 그냥 포인터 쓰지말고 변수를 직접 써도 될텐데말이죠.하지만 포인터가 필요한부분이 있습니다. 그리고 포인터를 배우고나면 컴퓨터 구조에 대해서 어느정도 이해하고 갈수 있을겁니다.사실 포인터가 어렵다는말은 들어보셨을수 있겠지만 개념자체는 그렇게 어려운것이 아닙니다. 기본이 튼튼하게 잡..
[C언어 강좌] #35 포인터 *연산자 이번에 배울것은 포인터 *연산자입니다.*연산자는 우리가 곱셈을 하는 연산자로 많이 사용했었죠. 그리고 포인터를 선언할때도 사용했었습니다.하지만 이것도 &와 마찬가지로 포인터에서는 다르게 쓰입니다. 피연산자가 두개가 아닌 오른쪽에 한개만 있을경우 다르게 쓰입니다. 우리는 포인터를 선언하고 포인터가 특정한 메모리영역을 가리키게 할수 있습니다.근데 그래서 어떻게할까요? 아직까지 포인터는 아무데도 쓸수가 없었습니다.하지만 오늘 *연산자를 배우고나면 포인터를 사용할수 있게됩니다. *연산자는 포인터가 가리키고있는 메모리 공간에 접근할수 있습니다.포인터에 저장되있는 주소가 005f123이라고 하면 *연산자를 사용할경우 005f123번째 메모리 영역에 접근하게됩니다. 이런식으로 포인터가 가리키는 메모리영역에 접근해서 ..