포인터
스택 포인터
스택FILO(First In Last Out)형태로 데이터를 액세스하는 데이터 구조이다. 즉, 가장 나중에 들어온 것부터 차례로 액세스하는 것이다. Heap은 Stack과 반대로 FIFO형태로 데이터를 액세스한다. 스택은 한 곳으로만 액세스할 수 있으며, 이부분을 스택의 탑이라고 한다. FILO의 액세스 순서 : 5 → 4 → 3 → 2 → 1FIFO의 액세스 순서 : 1 → 2 → 3 → 4 → 5 중앙처리장치는 기억장치의 특정 영역을 스택 영역으로 지정하여 운영한다. 스택에 저장되는 데이터의 크기는 레지스터의 크기, 데이터 버스의 폭과 같다. 즉 스택은 컴퓨터의 단어(word)단위로 액세스 된다. 만일 기억장치가 바이트 단위로 구성되어 있고 레지스터의 크기가 16 비트이면, 두 개의 기억장소에 한개..
[C] 함수의 포인터 / 배열 매개변수
함수의 매개변수로 배열 사용법 배열을 함수의 전달 인자로 사용하려면 배열의 변수명은 첫 번째 원소의 주소값이기 때문에 매개변수의 타입은 포인터가 되어야 한다. void 함수명(int* arr) { } 둘 다 동일한 의미를 지닌다 void 함수명(int* arr) { } void 함수명(int arr[]) { } #include #define Size 10 void Arrprint(int *Arr); void Arrprint2(int Arr[]); int main () { int i_arr[Size] = {1,2,3,4,5,6,7,8,9,10}; Arrprint(i_arr); Arrprint2(i_arr); return 0; } void Arrprint(int *Arr){ for(int i = 0; i
[Unreal] 업/다운캐스팅 (Cast 함수) 동작 원리
실제로 언리얼의 Cast 는 다음과 같이 구현되어 있다 : // Dynamically cast an object type-safely. template FORCEINLINE To* Cast(From* Src) { return TCastImpl::DoCast(Src); } 내부적으로 TCastImpl 을 부르고 있다 template struct TCastImpl { // This is the cast flags implementation FORCEINLINE static To* DoCast( UObject* Src ) { return Src && Src->GetClass()->HasAnyCastFlag(TCastFlags::Value) ? (To*)Src : nullptr; } FORCEINLINE sta..
[C] 배열과 포인터의 관계 (변수형 포인터, 상수형 포인터), 포인터로 배열 변경하기
포인터는 크게 상수형 포인터와 변수형 포인터로 나뉠 수 있다. 결론부터 말하자면, 배열을 선언하는 변수는 "상수형 포인터" 그 외는 "변수형 포인터"이다. 배열 선언시 char arr[ ]; 이런식으로 선언하는데 실제 arr 은 상수형 포인터다. 즉 주소값을 알고있는 Lable이다. 그래서 char * arr; 이랑 똑같은 구조라 할 수 있지만, * 로 선언하면 "변수"로 선언했기 때문에 포인터 변수의 주소값을 바꿀 수 있고, char arr [ ] 으로 선언하면 상수이므로 그 주소를 바꿀 수 없다. 그리고 이 arr은 내 첫번째 배열값의 주소를 가리키고 있다. (이때 arr의 자료형이 무엇이냐? 하면 포인터이므로 char * 자료형이다 라고 한다.) - int arr[ ]; 으로 선언하면 int형크기(..
[C] 포인터로 문자열 선언, 배열 문자열 선언과 차이. (문자열 내부 변경하기)
문자열(string)이란, 알파벳 하나하나가 메모리상의 연속적으로 나열되며, 마지막에는 '\0' (NULL)으로 끝나는 배열이다. 위 그림과 같이 문자열을 만드는 방법은 아래와 같다. char string[11] = "hello world"; char이므로 한칸당 1byte를 사용하며, "~~"문자열 맨 뒤에 \0 (NULL)문자는 자동으로 들어가게 된다. 고로 띄어쓰기를 포함한 모든 문자들 공간과 마지막의 NULL이 들어갈공간을 포함해 11개의 공간을 선언했다. C언어로 문자열을 표현하는 방법은 대표적으로 배열선언과 포인터 선언이 있다. 배열도 "상수형 포인터"로 결국 포인터와 동일한 역할을 한다. 배열으로 선언하는 방법은 메모리공간을 미리 할당하는 방법과, 컴파일러가 문자열 길이를 보고 알아서 할당시..
void* 포인터 크기
각 시스템마다 차이가 있다. 16비트 - 2 바이트 32비트 - 4 바이트 64비트 - 8 바이트 #include int main() { void *ptr; printf("The size of pointer value : %d", sizeof(ptr)); return 0; } 또는 #include using namespace std; int main() { cout
C# 포인터 사용
C#에서는 포인터를 안전하지 않은(unsafe) 형식으로 지정하여 표면적으로는 지원하지 않고 있지만 기존의 C++의 라이브러리 등의 외부 라이브러리를 사용한다던가 프로그램의 비약적인 성능향상의 목적을 위해 사용할 필요성을 가지게 된다. 이러한 포인터를 사용하기 위해서는 다음과 같은 절차를 거쳐야 사용할 수 있다. 1. 솔루션설정변경 생성한 솔루션에서 설정메뉴를 통해 들어간 뒤 빌드를 확인하면 위와 같이 안전하지 않은 코드를 사용할 수 있는 체크박스를 확인할 수 있다. 이 항목을 체크하면 솔루션 내에서 포인터를 사용할 수 있는 조건을 만들어 주게 된다. 2. unsafe 블럭 생성 class Program { static void Main(string[] args) { int number = 10; uns..
C/C++ 예외상황에서의 포인터의 동작
포인터의 사용법의 구문과 의미는 C 표준 문서(http://bit.ly/173cDxJ)에 매우 자세히 설명되어 있다. 그러나 표준 문서가 포인터의 동작을 명확히 정의하지 못하는 경우가 있다. 이러 떄 표준 문서는 포인터의 동작을 다음과 같이 정의한다. - 구현 방법에 따라 정의된 행동(Implementation-defined behavior) 동작에 대한 문서화된 구현을 제공한다. 구현 방법에 따라 정의된 행동의 예로, 정수에 대한 오른쪽 시피트 연산에서 상위 비트의 확장 방법이 있다. - 명시되지 않은 행동(Unspecified behavior) 동작에 대한 구현을 제공하지만 문서화하지 않는다. malloc함수에 인자로 0을 주고, 실핼할 때 메모리가 얼마나 할당되는가 하는 것이 명시되지 않은 행동의 ..
[Unreal] 포인터 널 체크는 조심히 하도록 하자
UStaticMeshComponent* StaticMeshComp; // 아래 널 체크는 예기치않은 크래시를 초래할 수 가 있음. if(StaticMeshComp) 또는 if(StaticMeshComp != nullptr) // 아래 함수를 이용하도록 하자. 삭제 대기중인지, 개비지컬렉터가 수집을 안했는지까지 확인해준다. if(IsValid(StaticMeshComp))
C++ inout형 포인터 *&
*&는 단순하게 포인터의 주소를 뜻한다, 쉽게 말해 포인터의 주소다. 착각하지 말아야할게 *&로 보낸다고 해서 참조 대상의 주소를 보내는게 아니다. 아래 레퍼런스는 참조 대상이다. int main() { int* p2 = new int(1); // 아래 *&p2는 &(*p2)의 의미를 가지고 있다. cout