C에서의 화살표 연산자(->) 사용법
는 '라는 책을 와 C더 속도로 과 그 장을 .->
교환원이 아무 설명 없이 다가왔어요멤버나 함수를 호출할 때 사용합니다(예:.
단, 멤버 . (dot)는.하지만 나는 완전히 확신하지 못한다.
설명과 코드 샘플을 받을 수 있을까요?
foo->bar
(*foo).bar
를 ,, ,, 버, 버, 합, 합, 합이다라고 합니다.bar
foo
가리키고 있습니다.
네, 그렇습니다.
참조 대신 포인터인 구조/클래스의 요소에 액세스하려는 경우 도트 버전입니다.
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;
}
서 포인터 「」ptr
structure 변수의 주소(!)를 가리킵니다.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).kg
⟹audi.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
'programing' 카테고리의 다른 글
MariaDB - 주문이 있는 그룹화 기준 (0) | 2022.09.08 |
---|---|
D_XOPEN_SOURCE는 무엇을 의미합니까? (0) | 2022.08.25 |
Vue 라우터 및 Cordova(Vue.js) (0) | 2022.08.25 |
Vue 3 라우터는 부모 뷰에 후행 슬래시를 추가하지 않으므로 기본 자식 vue 컴포넌트를 렌더링하지 않습니다. (0) | 2022.08.25 |
피카소를 사용하여 이미지 크기를 전폭 및 고정 높이로 조정 (0) | 2022.08.25 |