무엇을 가리키고 있습니까???

4738 단어 cppcsharpcprogramming
C를 제대로 활용하려면 C가 메모리를 처리하는 방법을 이해해야 합니다.


C 언어는 프로그램이 컴퓨터 메모리를 사용하는 방법에 대해 훨씬 더 많은 제어를 제공합니다. 배후에서 변수를 할당, 수정 또는 사용할 때마다 어떤 일이 발생하는지 살펴보겠습니다.

C 코드에는 포인터가 포함됩니다.



To best understand pointers, go slowly



포인터는 이해해야 할 가장 기본적인 것 중 하나입니다.
C 프로그래밍 언어. 그래서 포인터는 무엇입니까? 포인터는
메모리에 있는 데이터 조각의 주소입니다.

포인터는 다음과 같은 이유로 유용합니다.


  • 데이터의 전체 복사본을 전달하는 대신 원본 데이터에 대한 포인터만 전달할 수 있습니다.
  • 별도의 복사본이 아닌 동일한 데이터 조각에서 작동하는 두 개의 코드 조각이 필요할 수 있습니다.

  • 설명을 위해 다음 코드를 살펴보십시오.


    프로그램은 n을 100으로 시작하므로 n이 1씩 증가하면 이제 101이 됩니다. 적어도 코드가 작동하면 됩니다.

    Look at the code carefully. Do you think it will work? Why? Why not?





    > gcc addone.c -o addone
    > ./addone
    the value of n is 100
    the value of n is now 100
    

    흠, 왜 우리 함수가 작동하지 않았지?

    C는 인수를 값으로 보냅니다.



    C가 함수를 호출하는 방식 때문에 코드가 손상되었습니다.
  • 처음에 main() 함수에는 값이 100인 n이라는 로컬 변수가 있습니다.
  • 프로그램이 add_one() 함수를 호출할 때 main()에서 add_one()으로 n의 값을 복사합니다. 즉, 같은 변수처럼 보이지만 함수를 호출할 때 변수를 인수로 보내는 것이 아니라 값만 전달하기 때문이 아닙니다.
  • add_one() 함수가 n의 값을 변경할 때 함수는 로컬 복사본만 변경합니다. 즉, 컴퓨터가 main() 함수로 돌아갈 때 n 변수는 여전히 원래 값 100을 가집니다
  • .

    그러나 그것이 C가 함수를 호출하는 방식이라면 값을 업데이트하는 함수를 어떻게 작성할 수 있습니까?
    포인터를 사용하면 쉽습니다 ...

    메모리 포인터 사용


    1. 변수의 주소 얻기


    & 연산자를 사용하여 변수가 메모리에 저장된 위치를 찾을 수 있습니다.

    int x = 4;
    printf("x lives at %p\n", &x);
    


    그러나 변수의 주소가 있는 경우 어딘가에 저장하고 싶을 수 있습니다. 이를 위해서는 포인터 변수가 필요합니다. 포인터 변수는 메모리 주소를 저장하는 변수일 뿐입니다. 포인터 변수를 선언할 때 어떤 종류의 데이터가 가리킬 주소에 저장되어 있는지 말해야 합니다.

    int *address_of_x = &x;
    printf("x lives at %p\n", address_of_x);
    


    2. 주소 내용 읽기



    메모리 주소가 있으면 거기에 저장된 데이터를 읽고 싶을 것입니다. * 연산자를 사용하여 수행합니다.

    int value_stored = *address_of_x;
    

    *& 연산자는 반대입니다. & 연산자는 데이터 조각을 가져와 저장 위치를 ​​알려줍니다. * 연산자는 주소를 받아 거기에 무엇이 저장되어 있는지 알려줍니다.

    Because pointers are sometimes called referrences, the * operator is said to dereference a pointer.



    3. 주소 내용 변경



    포인터 변수가 있고 변수가 가리키는 주소의 데이터를 변경하려면 * 연산자를 다시 사용하면 됩니다. 하지만 이번에는 과제의 왼쪽에 사용해야 합니다.

    *address_of_x = 99;
    



    이제 메모리 위치(포인터)의 내용을 읽고 쓰는 방법을 알았으니 add_one() 함수를 수정할 차례입니다.




    해결책





    > gcc addone.c -o addone
    > ./addone
    the value of n is 100
    the value of n is now 101
    


    코드가 작동합니다.



    이 함수는 포인터 인수를 사용하기 때문에 다음을 수행할 수 있습니다.
    원래 n 변수를 업데이트합니다.
    즉, 이제 함수를 만드는 방법을 알고 있다는 의미입니다.
    값을 반환할 뿐만 아니라 모든 메모리를 업데이트할 수도 있습니다.
    그들에게 전달되는 위치.


    중요 항목


  • 변수가 메모리에 할당된 저장소
  • 포인터는 메모리 주소를 저장하는 변수일 뿐입니다
  • .
  • & 연산자는 변수
  • 의 주소를 찾습니다.
  • * 연산자는 메모리 주소의 내용을 읽을 수 있습니다
  • .
  • * 연산자는 메모리 주소의 내용도 설정할 수 있습니다
  • .

    좋은 웹페이지 즐겨찾기