[C/C++] Pointers

CS/C/C++ 2009. 1. 18. 20:28
1. 배열의 끝을 하나 넘어선 포인터
배열의 끝을 하나 지난 포인터를 취하는것은 동작하는 것이 보장된다.
이것은 많은 알고리즘에서 중요하다.
하지만, 이런 포인터는 배열의 요소를 실제로 가리키고 있지 않기때문에, 읽거나 쓰는데 사용되선 안된다.
int main(void)
{
	...
	char a[3] = {'a', 'b', 'c'}

	char *start = &a[0];
	char *end = &a[4];

	while (p != end) cout << *p++;
	...
	return 0;
}

2. 포인터 연산 
하나의 포인터에서 다른 포인터를 뺐을 경우, 결과값은 포인터 값이다.
이때 포인터 연산은 같은 배열에 대해서 이루어 져아 한다.
 
void f()
{
	int v1[10];
	int v2[10];

	int i1 = &v1[5] - &v1[3]; // i1 = 2
	int i2 = &v1[5] - &v2[3]; // result undefined

	int *p1 = v2 + 2; // p1 = &v2[2]
	int *p2 = v2 - 2; // result undefined
	int *p3 = &v2[4] - 2; // p3 = &v2[2]
}

3. Pointer to constant VS Constant pointer
  
int main(void)
{
void f()
{
	char s[] = "Grom";
	
	const char* pc = s; // pointer to constant. *PC가 상수
	char* const cp = s; // constant pointer. CP가 상수
	const char* const cpc = s; // constant pointer to constant. *CPC, CPC 모두 상수
}
포인터를 상수로 만드는 선언자는 *const 이며, const* 선언자는 없다.
따라서 *전에 나오는 const는 기본 타입으로 간주된다.
 
char *const cp; // const pointer to char
const char* pc; // pointer to const char
char const* pc; // pointer to const char
원문 : C++ Programming Laguage 3rd Edtion.
: