[C#] 처리 포인터

7795 단어 C#tech
프로젝트에서 Swift와 C#의 교접이 진행되고 있는데 그곳에서 문자열로 교접하는 순간 C#측의 처리 지침이 필요하다.
결국 스위프트 측에서 차*를 지목해 C#string으로 받아들이는 맞춤법이 이뤄졌지만, 인생에서 처음으로 Pointer를 진지하게 사용하게 됐기 때문에 이 일을 적고 싶었다.

바늘이 어려워요?


C 언어를 배우기 시작한 학생들의 첫 좌절점은 지침인 것 같아서 이해할 수 있다고 생각한다.
변수와 함수라는 프로그래밍 특유의 개념을 파악한 후 지침이 나오면 어떤 혼란이 생길까?
예를 들어 Int 변수입니다.
int temp = 1;
에는 변수라는 상자에 수치를 넣는 설명이 자주 나온다.
지침이 나오면 이 상자의 비유가 한꺼번에 터지기 때문에 진지하게 듣는 첫 번째 학자일수록 지침의 출현으로 혼란스러워진다.

상자라기보다는 메모리라기보다는


지침을 잘 이해하려면 CPU와 메모리의 관계를 미리 파악할 필요가 있다고 생각한다.
단지 프로그래밍을 하고 싶은 초보자처럼 대부분의 사람들이 이해할 수 없기 때문에 상자라는 비유는 매우 편리하다.
변수는 정확히 말하면 메모리의 값으로 모든 변수는 각자의 주소를 가지고 있다.
지침은 주소 정보를 가진 변수라는 것을 설명할 수 있을 것 같지만 아무래도 첫 번째 학자에게는 어렵다.

포인터를 사용하지 않습니까?


내 생각엔 그렇긴 한데.
나는 사용해도 사용해서는 안 된다고 생각한다.
낮은 층은 물론이고 현대 응용 개발에서 메모리에 접근하려는 프로그램은 기본적으로 없다고 생각한다
있으면 연출 목적이지만 컴파일러를 최적화하려고 노력하면 줄거리가 더 좋아진다.

C# 포인터


C#는 다른 C 언어(잘 모르겠지만)에 비해 안전성이 조금 높아'포인터를 사용하지 말자'는 느낌이 든다.
바늘을 사용하려면 unsafe 섹션을 사용하지 않으면 컴파일할 수 없습니다.
unsafe
{
  // using pointer code
}
또한 컴파일 옵션을 통해 unsafe를 허용하지 않으면 프로그램을 실행할 수 없습니다.
Unity 환경에서PlayerSettings Other Settings의Allow'unsafe'Code를 확인하십시오.
기본적으로 체크했을 수 있습니다.

fixed


포인터는 메모리를 참조하지만 참조된 개체는 Gabee 즐겨찾기 라이브러리에서 재구성될 수 있습니다.
다시 설정해도 바늘의 주소는 변하지 않기 때문에 예상한 값이 아닌 것을 처리합니다.
이를 막기 위해fixed 문구를 준비했다.
unsafe
{
    fixed (int* p = &a[0])
    {
        // code
    }
}

char*를 처리하는 예


드디어 샘플 코드가 도착했습니다.
다음 샘플 코드에서 char형 포인터를 String으로 복원합니다.
private unsafe void getString(char* p_str)
{
    return new string(p_str);
}
정말 어떤 제약 때문에char*를 받는다면 이런 느낌으로string으로 빨리 전환하는 것을 권장합니다.
C# string구조기에 String(Char*)이 있습니다.
내가 이 코드를 처음 봤을 때, "주소만 있으면string의 길이를 몰라요?"나는 이런 의문이 있다.
흥미가 있다면 2진법으로 출력하는 것도 흥미롭다. C#의string형 시작 4Byte 길이를 기록하는 구역이 있다.
여기 보시면string의 길이를 알 수 있기 때문에char*를 잘 처리할 수 있습니다.
반대로 메모리에 있는 정보와string의 구상이 일치하지 않으면 예외든 기적이든 순조롭게 진행되면 성대하게 문자화된다.

포인터 플러스 / 마이너스


나는 지침이 매우 흥미로운 것은 지침 자체가 가산감법을 할 수 있다는 것이다.
뭐라고 하는지 얘기해야 돼.
int[] a = new int[5] { 10, 20, 30, 40, 50 };
unsafe
{
    fixed (int* p = &a[0])
    {
        Console.WriteLine(*p); // 10
        p += 1;
        Console.WriteLine(*p); // 20
        p += 1;
        Console.WriteLine(*p); // 30
    }
}
이 코드를 실행한 후 10, 20, 30으로 출력한다.
int*를 합치면 수조의 색인을 진일보할 수 있습니다.
주소 자체가 32비트 또는 64비트(CPU)인 바이너리[1]
주소 번호 1을 붙이면 알 수 없는 곳으로 날아갈 수 있지만 int와char는 기본적으로 형식적인 정보가 있다
그 유형에 맞추어 몇 분 동안 비행하다.
그리고 설명의 순서가 좀 이상하지만 &a[0]에서 배열된 첫 번째 요소의 주소(int*)를 얻을 수 있습니다.
포인터 참조 대상 값에 액세스하려면 *p로 기술하십시오.

참고 자료


포인터(C# 프로그래밍 가이드)
char*→string형
각주
예를 들어 0xFFFFF와 같은 32비트의 예입니다.2진법으로 표기하면 비교적 길기 때문에 16진수↩︎

좋은 웹페이지 즐겨찾기