반응형
포인터와 관련이 있는 내용들을 설명하겠습니다. 여기서 한장자라고 하면 제한을 걸때 사용되는 키워드라고 할 수 있습니다.
포인터의 const 선언
const는 변수를 상수화 하는 용도로 사용이 됩니다. 이번에는 포인터에 적용해보도록 하겠습니다.
int number =10;
int* ptr = &number;
여기서 const가 들어갈 수 있는 자리는 2군데 있습니다.
const int* const ptr = #
포인터 선언 앞에 사용될 수 있고, 포인터 변수의 이름 앞에 삽입될 수도 있습니다. 두 군데 모두 사용할 수도 있습니다.
int number = 10;
const int* ptr = &number;
이렇게 사용이 된다면 포인터 ptr은 가리키는 대상에 대한 값의 변경이 허용되지 않습니다. 예를들어 *ptr=20; 이런 문장이 컴파일 에러를 발생키기죠. 즉, 포인터를 이용한 값의 변경을 허용하지 않겠다는 뜻이 됩니다.
int number = 10;
int* const ptr = &number;
이번에는 포인터 변수의 이름 앞에 사용이 되었습니다. 이 선언은 포인터 변수 ptr을 상수화 시킨다는 의미입니다. 즉, 포인터 변수 ptr에 저장된 값의 변경이 불가능 하다는 뜻이 됩니다. 때문에 이러한 선언을 하게되면 포인터 ptr은 끝까지 변수 num만 가리키게 됩니다.
결론적으로 첫 번째 선언은 ptr이 가리키는 변수에 저장된 값을 변경할 수 없고, 두 번재 선언은 ptr 자체가 number의 주소값으로 상수화 되어 변경할 수 없다는 의미입니다.
volatile 과 restrict 키워드는 간단하게 넘어가겠습니다.
volatile 키워드는 변수의 선언 앞에 사용됩니다. 해당 변수와 관련해서는 코드 최적화를 수행하면 안된다는 의미입니다. restrict은 그 반대로 최적화를 우도하는 선언입니다. 포인터 선언에서의 restrict 키워드는 이 포인터가 가리키는 메모리 공간은 이 포인터만으로 접근이 가능하다는 것을 의미합니다. 때문에 해당 포인터가 가리키는 메모리 영역의 접근 연산은 캐쉬 메모리를 기반으로 최고의 성능을 낼 수 있도록 코드가 최적화됩니다.
다음은 메모리 컨트롤 관련 함수입니다.
memmove : 어떠한 경우에도 사용할 수 있는 메모리 복사 함수
cf) void* memmove(void* dest, const void* src, sizt_t len);
->매개변수 src로 전달된 값을 시작주소로 하여 len바이트를 읽어 들여서, 매개변수 dest로 전달된 주소에 복사를한다.
memcpy : 제한된 상황에서의 메모리 복사
cf) void* memcpy(void* restrict dest, const void* restrict src, size_t len);
->memmove와 기능상 차이는 없다. 그러나 dest와 src가 restrict으로 선언되었다. 따라서 함수가 호출되면서 dest와 src로 전달된 주소 값의 메모리는 각각 dest와 src로만 접근이 가능해야 한다.(원본대상과 복사본이 겹치는 경우 사용할 수 없다)
반응형
'Basic > C/C++' 카테고리의 다른 글
[C언어] 제 23 강 : 그 외 함수들과 파일 분할 (0) | 2012.01.29 |
---|---|
[C언어] 제 22 강 : 파일 입출력 (3) | 2012.01.28 |
[C언어] 제 21 강 : 구조체, 공용체 그리고 열거형 (0) | 2012.01.27 |
[C언어] 제 20 강 : 매크로와 전처리기 (0) | 2012.01.27 |
[C언어] 제 19 강 : 문자열 관련 표준 함수 (0) | 2012.01.26 |
[C언어] 제 17 강 : 함수의 포인터 활용과 메모리 할당 (1) | 2012.01.24 |
[C언어] 제 16 강 : 배열과 포인터, 포인터 연산 (0) | 2012.01.22 |
[C언어] 제 15 강 : 포인터의 포인터 그리고 포인터 배열 (0) | 2012.01.19 |
[C언어] 제 14 강 : 포인터의 기본적인 개념 (0) | 2012.01.19 |
[C언어] 제 13 강 : 배열 (6) | 2012.01.19 |