c언어를 공부하시다 보면, 한 번 쯤 막히는 부분이 있습니다. 배열 포인터. 쉽게 말해서 배열을 가리키는 무언가입니다. 나중에 행 우선 열 우선 방식을 할 때 다시 언급을 하고, 여기에서는 간단하게 언급을 하겠습니다. 이 글을 읽기 위해서 중요한 것은 배열은 배열 그 자체로 다루어야 한다는 점입니다. 4번째 줄을 보시면, 4 by 4짜리 배열이 선언되어 있습니다. 그리고 5번째 줄에, int (*p)[4] = &(a[0])이라 되어 있는데요. 좌항부터 해석해 보겠습니다. 시계 방향 rule에 따라서 보도록 하겠습니다. 먼저, 4번째 줄부터 해석되는데요. (*p)는 p가 포인터이다. 라는 의미입니다. 그런데, 어떤 포인터일까요? 돌려 보니까 [4]라고 되어 있습니다. 이것은 [4]개짜리의 원소를 가진다는 ..
포인터 검색 결과
제목. 왜 10시간동안 아래 코드가 잘못된 동작을 하는 원인을 찾았는가? 제목이 꽤나 성가실 지도 모르겠습니다만, 오늘 몇 시간동안 삽질한 주제였습니다. 자신의 코드는 잘 안 보인다고 하는데, 그 말이 딱 맞았습니다. 심지어 고인물들이 모여 계시는 알고 싯포 톡방에서, const char * 문제인가? 를 가지고도 간접적으로 질문을 했는데, 실험도 해 보고, 이것 저것 팁들을 들어보니, 이것도 답이 아니였습니다. 당연하게도, 제가 완전히 잘못 파악한 것이였습니다. 부들부들 해당 문제를 풀기 위한 코드를 보도록 하겠습니다. 먼저, dp 함수는 아래와 같습니다. for loop를 돌면서, temp에 app(i, x-i)를 수행한 결과물인 string의 c_str()의 주솟값을 넣습니다. 그리고, temp와 ..
드디어 200번째 글입니다. void형 포인터에 대해서 배워봅시다. 보통 우리는 다음과 같이 썼을 거에요. 이것은 무엇을 의미할까요? 일단 p에 15를 넣습니다. p는 메모리에 어딘가에 할당이 되어 있을 겁니다. 그리고 이 p의 주솟값을 a가 들고 있습니다. 예를 들어 p의 주소가 0x80이라면 a는 0x80을 들고 있는 것입니다. 다음에 (*a)++이 있는데요. 이는 (*a) = (*a) + 1을 의미합니다. a를 역참조하면 p가 되므로, 결국 p에 1을 증가시키라는 것과 같습니다. 최종적으로는 p = 16이 될 거에요. a는 int형 자료형을 가르켰어요. void형 포인터는 이와 다르게, 주솟값을 저장하고 있기는 한데, 가리키는 자료형을 모르는 pointer를 의미합니다. 아래 예제를 봅시다. int..
배열이랑 포인터의 관계를 들어가기 전에, 하나만 짚고 넘어가겠습니다. 배열과 포인터는 같은 개념일까요? 결론부터 말하면 아닙니다. 따라서, 배열 이름을 상수 포인터라고 한 것은, 올바른 표현이 아닙니다. 후자는 아래와 같이 선언된 것을 의미합니다. address 값을 저장하기 위한 별도의 변수가 5번째 줄에 선언이 되어 있습니다. 예제 1을 봅시다. 5개의 원소를 저장하고 있는 배열 arr을 선언했습니다. 그리고 어떠한 공간을 가리키는 int형 포인터 변수인 p를 선언했어요. 그리고 p가 가리키고 있는 데이터를 출력하는 간단한 프로그램입니다. 4번째 줄을 보시면, arr을 선언했습니다. 그러면 메모리 상에 다음과 같이 할당될 겁니다. 그런데, 배열이던, int형이던, double형이던, 메모리의 어디에 ..
포인터의 증감 연산을 간단하게 다루어 보도록 하겠습니다. 포인터 변수의 값 + 값 먼저, 이 경우부터 보도록 합시다. 아래 프로그램을 생각해 봅시다. int형 변수 a가 선언되었습니다. 그리고 p는 int형 포인터 변수입니다. p는 a의 주솟값을 가지고 있어요. 그러면, p, p+1, p+2는 각각 어떤 값이 나올까요? 4만큼 차이나는 것을 볼 수 있어요. p+1은, p로부터 4바이트, p+2는 p+1로부터 4바이트만큼 증가한 것을 볼 수 있는데요. 자료형의 크기만큼 더했다는 것을 볼 수 있어요. long long형이면 어떨까요? sizeof(long long)의 값도 같이 출력해 봅시다. 처음에 size = 8이 나왔습니다. 해당 환경에서, long long형은 8byte만큼 차지한다는 의미입니다. 이..
최근댓글