포인터에 const가 붙으면 상당히 헷갈립니다. 이것들은 대체 무엇을 의미하는 것일까요? 먼저 아래와 같이 선언된 것을 봅시다. 이것은 p가 const char형을 가리키는 포인터임을 의미합니다. strcpy나, strcat 등의 인자가 이런 식으로 선언이 많이 되어 있음을 볼 수 있을 거에요. 예를 들면 이런 식입니다. 이는 original data인, 원본 문자열이 변경되면 안 되기 때문이에요. 12번째 줄은, *(ori+1)을 변경하려고 시도하는데요. ori가 const char형을 가리키는 포인터입니다. 이는 변경 불가능한 Read Only data입니다. *(ori+1) 또한, Read Only이고, 이를 변경하려고 하기 때문에, 오류가 발생합니다. const char *pat은, pat이 가리..
코딩/C 검색 결과
배열이랑 포인터의 관계를 들어가기 전에, 하나만 짚고 넘어가겠습니다. 배열과 포인터는 같은 개념일까요? 결론부터 말하면 아닙니다. 따라서, 배열 이름을 상수 포인터라고 한 것은, 올바른 표현이 아닙니다. 후자는 아래와 같이 선언된 것을 의미합니다. 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만큼 차지한다는 의미입니다. 이..
저번 시간에 포인터 변수에 대해 배웠습니다. 오늘은 구조체 포인터를 써 보도록 하겠습니다. 사실, 링크드 리스트 구현할 때 상당히 많이 쓸 거에요. 예를 들어서 p->next? 아니면 p->prev? 이런 식으로 많이 쓰실 건데요. ->가 무엇인지도 오늘 알아보도록 하겠습니다. 먼저 main 함수 안에 point형 구조체 변수가 선언이 되어 있다고 해 봅시다. 8번째 줄에 point형 지역 변수인 p를 선언했습니다. 그러면 메모리에는 위와 같이 할당이 될 겁니다. 맞나 모르겠네요. 그러면, 메모리의 어느 위치에, p를 위한 공간이 만들어 진 거에요. 역참조도 할 수 있을까요? 주솟값만 알고 있다면, 그것을 통해서 간접 참조를 할 수 있을 텐데요. 9번째 줄을 보면, t에 p의 주솟값을 넣고 있습니다. 그..
c++의 algorithm 헤더에는, 두 변수를 바꾸는 swap 메서드가 있습니다. 두 수를 바꾸는 swap 함수를, 구현해 봅시다. 저번 시간에 배운 포인터도 복습해 볼 겸 말입니다. Main 함수에 a와 b가 할당되어 있습니다. 우리는 함수를 통해서 이 둘을 바꿔보려고 합니다. 그런데, 함수로 이 둘을 깡으로 넘기기에는, 힘들어 보입니다. 왜냐하면, 정수형으로 그냥 복사해 버리면, 다음과 같이 별개의 공간에 매개 변수가 생성이 되기 때문입니다. 그러면 우리는, Main에 있는 a의 주솟값과, b의 주솟값을 넘기자는 생각을 할 수 있습니다. 이 둘의 주솟값을 각각 0x80번지, 0x84번지라고 한다면, 다음과 같이 복사하면 됩니다. 이러한 주솟값을 저장할 수 있는 변수는 포인터 변수입니다. 정수형 포인..
최근댓글