개발/C와 C++

[C/C++] -> 화살표 연산자와 . 도트(멤버) 연산자 차이점과 사용

어중E 2022. 9. 3. 17:23

-> 화살표 연산자와. 도트(멤버) 연산자 차이점과 사용

ptrStr->name = "aa";

이런 화살표 연산자를 한 번쯤은 보셨을 겁니다. 사용상에 직감적으로 어느 구조체, 클래스에 name 변수에 접근한다는 것을 알 수 있으실 겁니다. 하지만 정확히 -> 와 . 의 차이점은 포인터인지 아닌지에 따라 결정됩니다.

 

struct Character {
	int level;
	int rank;
};

int main()
{
	struct Character myCharacter = { 1, 100 };
    
	myCharacter.level += 2;
}

일반적인 구조체 모습입니다. Character 구조체에 level 변수에 접근하는 것은 도트(멤버) 연산자로 위와 같이 접근을 할 수 있습니다.

 

struct Character {
	int level;
    int rank;
};

int main(){
	struct *myCharacter = malloc(sizeof(Character));
    
	*myChracter.level += 2; // 적절치 않음
}

경우에 따라 포인터로 구조체를 선언할 수 있는데, 이때에 멤버변수에 접근을 하려면, 언뜻 보기에는 위와 같이 사용하면 될 것 같습니다. 하지만 이 경우에는 myCharacter.level 통째로 참조 연산자(*)에 적용받습니다. 따라서 myCharacter의 구조체가 아닌  level로 역참조가 됩니다.

 

※ malloc은 메모리 할당(memory allocation) 입니다.

※ 해당 링크를 참조해주세요. https://thinkanother.tistory.com/8

struct Character {
	int level;
    int rank;
};

int main(){
	struct *myCharacter = malloc(sizeof(Character));
    
	(*myChracter).level += 2; // 적절함
}

따라서 이와 같이 괄호를 이용하여 먼저 연산되고 이후 도트(멤버) 연산자로 멤버변수에 접근을 하면, 하고자 하는 작업이 수행됩니다. 하지만 이것 역시 작업이 많아지면 간단한 부분이 아니기 때문에 -> 연산자를 사용합니다.

 

struct Character {
	int level;
    int rank;
};

int main(){
	struct *myCharacter = malloc(sizeof(Character));
    
	myChracter->level += 2; // 적절치 않음
}

-> 화살표 연산자를 사용하게 되면 보다 간편하게 사용할 수 있게 됩니다.