What is the arrow operator (—>) in C/C++?

Arrow operator

The arrow operator -> in C and C++ is used for accessing members (variables, methods) of a structure or class through a pointer. It’s specifically applied in scenarios involving dynamic memory allocation, linked lists, and other data structures and instances where objects are accessed through their pointers.

Arrow vs. dot operator

In the context of classes and structures in C and C++, when an object is accessed directly, its members are accessed using the dot operator (.). When an object is accessed through a pointer, the arrow operator -> is used to access its members.

The syntax can be visually understood as follows:

  • object.member: Using the dot operator to access a member directly

  • pointer->member : Using the arrow operator to access a member through a pointer

Essentially, the following relation holds true:

pointer->member == (*pointer).member

The expression (*pointer).member is a combination of dereferencing * and the dot operator ., which can be combined using the arrow operator ->.

#include <iostream>
using namespace std;
class Point {
public:
int x;
int y;
};
int main() {
Point p1 = {10, 20}; // Regular object of class Point
Point *p2 = &p1; // Pointer to p1
// Accessing members of p1 using the dot operator
cout << "p1.x = " << p1.x << ", p1.y = " << p1.y << endl;
// Accessing members of the object pointed by p2 using the arrow operator
cout << "p2->x = " << p2->x << ", p2->y = " << p2->y << endl;
return 0;
}
Dot (.) and arrow (->) usage

In the above example, p1.x and p1.y use the dot operator because p1 is a regular variable of type struct Point. In contrast, p2->x and p2->y use the arrow operator because p2 is a pointer to a struct Point.

Usage with structures

Example 1: Basic usage

The provided C++/C code defines a structure Sample with an integer member a, creates an object obj of that structure, uses a pointer ptr to assign the value 5 to obj.a using the arrow operator, and outputs the assigned value to the standard output.

#include<iostream>
using namespace std;
struct Sample {
int a;
};
int main() {
Sample obj;
Sample* ptr = &obj;
ptr->a = 5; // Using arrow operator
cout<< "ptr->a: " << ptr->a <<endl;
return 0;
}
Basic usage of (->) operator

Example 2: Dynamic memory allocation

The provided C++/C code defines a structure Sample with an integer member a, dynamically allocates memory for a Sample structure, assigns the value 5 to its a member using a pointer and the arrow operator, outputs the assigned value, and then frees the allocated memory, handling memory allocation failure with an error message.

#include<iostream>
using namespace std;
struct Sample {
int a;
};
int main() {
Sample* ptr = new Sample;
ptr->a = 5; // Using arrow operator
cout<< "ptr->a: " << ptr->a <<endl;
delete ptr; // Freeing allocated memory
return 0;
}
Dynamic memory allocation

Usage with classes

Example 3: Accessing class members

The C++/C code snippet defines a class Example with an integer variable x and a member function display(), creates an object obj of Example, uses a pointer ptr to assign 10 to x and call display(), outputting the value of x using the arrow operator.

#include<iostream>
using namespace std;
// Define a class to hold data
class Example {
public:
int x;
void display() {
cout << "Value of x: " << x << endl;
}
};
int main() {
Example obj;
Example* ptr = &obj;
ptr->x = 10; // Accessing variable using arrow operator
ptr->display(); // Accessing function using arrow operator
return 0;
}
Accessing class members

Example 4: Linked list

In linked list implementations, the arrow operator is used to traverse through the nodes by accessing the next node’s address.

#include<iostream>
using namespace std;
struct Node {
int data;
Node* next;
};
// Function to print linked list data
void print(Node* head) {
Node* current = head;
while(current != NULL) {
cout << current->data << " ";
current = current->next;
}
cout << endl;
}
int main() {
Node* head = new Node;
head->data = 1; // Assigning data to node using arrow operator
head->next = NULL; // Ensuring the list ends here
print(head); // Calling print to display linked list data
// Free the dynamically allocated memory
delete head;
return 0;
}
Use in the linked list

In the linked list example, head is a pointer to a Node type, and head->data and head->next are used to access members of the structure.

Conclusion

The arrow operator -> is vital in managing objects and structures through pointers, especially in complex data structures. It ensures code readability by providing a clear and concise way to dereference pointers when accessing member elements, encapsulating the dereference operation (*ptr). into a straightforward ptr-> expression.

Accelerate your coding journey – Master C and C++ today with our courses:

  • Learn C course – Dive into C programming and master key concepts like data types, control flow, functions, pointers, and memory management. Plus, get hands-on with powerful debugging and optimization tools like GDB and gcc to refine your skills.

  • Learn C++ course – Jumpstart your C++ journey with interactive execution sheets and flowcharts, perfect for beginners and those aspiring to become proficient C++ developers.

Free Resources

Copyright ©2025 Educative, Inc. All rights reserved