IT story

C에서 화살표 연산자 (->) 사용법

hot-time 2020. 4. 10. 08:19
반응형

C에서 화살표 연산자 (->) 사용법


"21 일 안에 C를 가르쳐라"라는 책을 읽고 있습니다 (이미 Java와 C #을 배웠으므로 훨씬 빠른 속도로 움직이고 있습니다). 나는 포인터에 관한 장을 읽고 있었고 ->(화살표) 연산자 는 설명없이 나타났습니다. 멤버와 함수를 호출하는 데 사용된다고 생각합니다 .(점 연산자와 동일하지만 멤버 대신 포인터). 그러나 나는 완전히 확신하지 못한다.

설명과 코드 샘플을 얻을 수 있습니까?


foo->bar와 같습니다 (*foo).bar, 그것은라는 멤버 얻을 즉 bar그 구조체에서 foo포인트를.


그래 그거야.

참조 대신 포인터 인 구조체 / 클래스의 요소에 액세스하려는 경우 도트 버전 일뿐입니다.

struct foo
{
  int x;     // 5
  float y;
};

struct foo var;
struct foo* pvar;
pvar = malloc(sizeof(pvar));

var.x = 5;   // var.x is 5
(&var)->y = 14.3;
pvar->y = 22.4;
(*pvar).x = 6;   // (*pvar).x is 5

그게 다야!


a->b(*a).b모든면에서 짧습니다 (함수와 동일 : a->b()는 짧음 (*a).b()).


나는 왜 "왜?"라는 답에 덧붙일 것입니다.

.*포인터 연산자 보다 우선 순위가 높은 표준 멤버 액세스 연산자입니다 .

구조체의 내부에 액세스하려고 할 때 *foo.bar컴파일러는 foo의 'bar'요소 (메모리의 주소)를 원한다고 생각하며 분명히 주소에는 멤버가 없습니다.

따라서 컴파일러에게 먼저 역 참조를 요청한 (*foo)다음 멤버 요소에 액세스 하도록 요청해야합니다.이 요소 (*foo).bar는 작성하기가 약간 어색하므로 좋은 사람들은 간단한 버전을 제공합니다. foo->bar이는 포인터 연산자에 의한 멤버 액세스의 일종입니다.


foo->bar의 속기입니다 (*foo).bar. 그것이 전부입니다.


struct Node {
    int i;
    int j;
};
struct Node a, *p = &a;

다음은이 값에 액세스 할 수 ij우리는 변수에 사용할 수있는 a포인터를 p다음과 같이 a.i, (*p).i그리고 p->i모두 동일합니다.

다음 .은 "직접 선택기"이며 ->"간접 선택기"입니다.


Jack의 프로그램을 실행하려면 약간 변경해야했습니다. 구조체 포인터 pvar를 선언 한 후 var의 주소를 가리 킵니다. C에서 Stephen Kochan 's Programming의 242 페이지 에서이 솔루션을 찾았습니다.

#include <stdio.h>

int main()
{
  struct foo
  {
    int x;
    float y;
  };

  struct foo var;
  struct foo* pvar;
  pvar = &var;

  var.x = 5;
  (&var)->y = 14.3;
  printf("%i - %.02f\n", var.x, (&var)->y);
  pvar->x = 6;
  pvar->y = 22.4;
  printf("%i - %.02f\n", pvar->x, pvar->y);
  return 0;
}

다음 명령으로 vim에서이를 실행하십시오.

:!gcc -o var var.c && ./var

출력합니다 :

5 - 14.30
6 - 22.40

#include<stdio.h>

int main()
{
    struct foo
    {
        int x;
        float y;
    } var1;
    struct foo var;
    struct foo* pvar;

    pvar = &var1;
    /* if pvar = &var; it directly 
       takes values stored in var, and if give  
       new > values like pvar->x = 6; pvar->y = 22.4; 
       it modifies the values of var  
       object..so better to give new reference. */
    var.x = 5;
    (&var)->y = 14.3;
    printf("%i - %.02f\n", var.x, (&var)->y);

    pvar->x = 6;
    pvar->y = 22.4;
    printf("%i - %.02f\n", pvar->x, pvar->y);

    return 0;
}

->운영자는보다 코드를 더 쉽게 읽을 *일부 상황에서 운영자입니다.

예 : EDK II 프로젝트 에서 인용 )

typedef
EFI_STATUS
(EFIAPI *EFI_BLOCK_READ)(
  IN EFI_BLOCK_IO_PROTOCOL          *This,
  IN UINT32                         MediaId,
  IN EFI_LBA                        Lba,
  IN UINTN                          BufferSize,
  OUT VOID                          *Buffer
  );


struct _EFI_BLOCK_IO_PROTOCOL {
  ///
  /// The revision to which the block IO interface adheres. All future
  /// revisions must be backwards compatible. If a future version is not
  /// back wards compatible, it is not the same GUID.
  ///
  UINT64              Revision;
  ///
  /// Pointer to the EFI_BLOCK_IO_MEDIA data for this device.
  ///
  EFI_BLOCK_IO_MEDIA  *Media;

  EFI_BLOCK_RESET     Reset;
  EFI_BLOCK_READ      ReadBlocks;
  EFI_BLOCK_WRITE     WriteBlocks;
  EFI_BLOCK_FLUSH     FlushBlocks;

};

_EFI_BLOCK_IO_PROTOCOL구조체는 4 명 함수 포인터 멤버가 포함되어 있습니다.

variable이 struct _EFI_BLOCK_IO_PROTOCOL * pStruct있고 좋은 이전 *연산자를 사용하여 멤버 함수 포인터를 호출 한다고 가정하십시오 . 다음과 같은 코드로 끝납니다.

(*pStruct).ReadBlocks(...arguments...)

그러나 ->연산자를 사용하면 다음과 같이 작성할 수 있습니다.

pStruct->ReadBlocks(...arguments...).

어느 것이 더 좋아 보입니까?


#include<stdio.h>
struct examp{
int number;
};
struct examp a,*b=&a;`enter code here`
main()
{
a.number=5;
/* a.number,b->number,(*b).number produces same output. b->number is mostly used in linked list*/
   printf("%d \n %d \n %d",a.number,b->number,(*b).number);
}

출력은 5 5 5


도트는 역 참조 연산자이며 특정 구조 레코드에 대한 구조 변수를 연결하는 데 사용됩니다. 예 :

struct student
    {
      int s.no;
      Char name [];
      int age;
    } s1,s2;

main()
    {
      s1.name;
      s2.name;
    }

이런 식으로 점 연산자를 사용하여 구조 변수에 액세스 할 수 있습니다

참고 URL : https://stackoverflow.com/questions/2575048/arrow-operator-usage-in-c

반응형