programing

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

minecode 2022. 8. 25. 23:33
반응형

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

는 '라는 책을 와 C더 속도로 과 그 장을 .->교환원이 아무 설명 없이 다가왔어요멤버나 함수를 호출할 때 사용합니다(예:.단, 멤버 . (dot)는.하지만 나는 완전히 확신하지 못한다.

설명과 코드 샘플을 받을 수 있을까요?

foo->bar (*foo).bar를 ,, ,, 버, 버, 합, 합, 합이다라고 합니다.barfoo가리키고 있습니다.

네, 그렇습니다.

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

struct foo
{
  int x;
  float y;
};

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

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

바로 그거야!

난 그냥 "왜?"라는 대답에 더하고 싶다.

.는 표준 로, 「우선순위」 「우선순위」 「우선순위」보다 우선도가 .*포인터 연산자

할 때 '내부를 들여다보다'라고.*foo.bar그러면 컴파일러는 'foo'(메모리 내의 주소)의 'bar' 요소를 원하는 것으로 생각되며, 그 주소에는 멤버가 없습니다.

.(*foo)다음에 멤버 에 접속합니다.(*foo).bar좀 버전을foo->bar포인터 오퍼레이터에 의한 멤버 액세스의 일종입니다.

뭐, 나도 뭐 하나 더 넣어야겠다.배열이 포인터이고 구조가 아니기 때문에 구조는 배열과 조금 다릅니다.그러니 조심하세요!

내가 이 쓸모없는 코드를 쓴다고 가정해 보자.

#include <stdio.h>

typedef struct{
        int km;
        int kph;
        int kg;
    } car;

int main(void){

    car audi = {12000, 230, 760};
    car *ptr = &audi;

}

서 포인터 「」ptrstructure 변수의 주소(!)를 가리킵니다.audi주소 구조 옆에 데이터 청크가 있습니다(!).데이터 청크의 첫 번째 멤버는 구조 자체와 동일한 주소를 가지며 이와 같은 포인터를 참조하는 것만으로 데이터를 가져올 수 있습니다.*ptr (브레이스 없음).

말고 ..km,.kph,.kg데이터 청크의 기본 주소에 대한 오프셋에 지나지 않습니다.

하지만 선호도 때문에 글을 쓸 수 없다.*ptr.kg operator " " as " " " as " " ".참조 해제 연산자 전에 평가됨*그러면 당신은*(ptr.kg)포인터에 멤버가 없기 때문에 불가능합니다!그리고 컴파일러는 이를 알고 있기 때문에 다음과 같은 오류가 발생합니다.

error: ‘ptr’ is a pointer; did you mean to use ‘->’?
  printf("%d\n", *ptr.km);

대신 이걸 쓰세요.(*ptr).kg컴파일러가 첫 번째 포인터를 강제로 참조 해제하고 데이터 청크에 대한 액세스를 활성화하고 두 번째로는 오프셋(디자이너)을 추가하여 멤버를 선택하도록 합니다.

내가 만든 이미지를 확인합니다.

여기에 이미지 설명 입력

그러나 중첩된 멤버가 있으면 이 구문을 읽을 수 없기 때문에->도입되었습니다.가독성만이 이 책을 이렇게 사용하는 정당한 이유라고 생각합니다.ptr->kg가 쉽다(*ptr).kg.

이제 연결을 더 명확하게 볼 수 있도록 다른 방법으로 적어보겠습니다. (*ptr).kg(*&audi).kgaudi.kg '이렇게 하다'라는 ptr는, 「」의 주소입니다. &audi그리고 "참조"가 &및 "참조 해제" *연산자는 서로를 지웁니다.

a->b is is is is의 줄임말이다(*a).b면에서 (동일)a->b() 말하다(*a).b()를 참조해 주세요.

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

here 、 ' 음음 。i ★★★★★★★★★★★★★★★★★」j할 수 .a 포인터 '''는p같이 .a.i,(*p).i ★★★★★★★★★★★★★★★★★」p->i뭇매를 맞다

서 ★★★★.는 ' 선택기'와 ' 선택기'입니다.->이렇게 '어느 쪽으로' 하다.

foo->bar의 일 뿐이다(*foo).bar그게 다예요.

#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 입니다.

잭의 프로그램을 실행하기 위해 약간의 변경을 가해야 했다.구조 포인터 pvar를 선언한 후 var 주소를 가리킵니다.나는 이 해결책을 Stephen Kochan's Programming in C의 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;
}

도트는 참조 해제 연산자로, 구조의 특정 레코드에 대한 구조 변수를 연결하는 데 사용됩니다.예:

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

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

이러한 방법으로 점 연산자를 사용하여 구조 변수에 액세스할 수 있습니다.

->는 코드를 쉽게 .*오퍼레이터가 필요할 수 있습니다.

예를 들어 (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개의 함수 포인터 멤버가 포함되어 있습니다.

.struct _EFI_BLOCK_IO_PROTOCOL * pStruct 옛것을 *해당 멤버 함수 포인터를 호출하는 연산자.하다

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

,를 ->연산자, 다음과 같이 쓸 수 있습니다.

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

어떤 게 더 나아요?

언급URL : https://stackoverflow.com/questions/2575048/arrow-operator-usage-in-c

반응형