struct data typeA 3-dimensional vector:
#include <iostream>
using namespace std;
int main() {
  // a 3-d vector can be represented 
  // as an array with 3 elements:
  double vec[3] = {5.5, 15.1, -8.5};
  cout << "x = " << vec[0] << endl;
  cout << "y = " << vec[1] << endl;
  cout << "z = " << vec[2] << endl;
}
x = 5.5
y = 15.1
z = -8.5
The same 3-dimensional vector, but now using a user-defined structure (of three doubles named x, y, and z)
#include <iostream>
using namespace std;
struct Vec3d {
  double x;
  double y;
  double z;
};
int main() {
  
  Vec3d vec; // Declaring a structure vec of type Vec3d
  vec.x = 5.5;  vec.y = 15.1;  vec.z = -8.5;
  cout << "x = " << vec.x << endl;
  cout << "y = " << vec.y << endl;
  cout << "z = " << vec.z << endl;
}
x = 5.5
y = 15.1
z = -8.5
The example below shows a structure called Brush with two members, double radius and int color.
Also, observe how a structure can be initialized, the same way as the arrays:
#include <iostream>
using namespace std;
struct Brush {
  double radius;
  int color;
};
int main() {
  // initialize a brush with
  // radius = 5.5, and color = 1
  Brush b = { 5.5, 1 };
  cout << "radius = " << b.radius << endl; 
  
  cout << "color = " << b.color << endl; 
}
radius = 5.5
color = 1
In C++, by default, all function parameters are passed by value.
And in this respect struct types not different from the simple types like int or double.
To make your function receive a structure variable passed by reference, we use the same function definition syntax, with the ampersand we used before:
Example: This program implements the functionality of a simple graphics editor, with a brush painting on the canvas.
We declare two structures:
Brush (with the members radius and color), andFrame (with the members width and height).The canvas is a 2-dimensional array of integers.
#include <iostream>
using namespace std;
const int W = 200;
const int H = 200;
struct Frame {
  int width;
  int height;
};
struct Brush {
  double radius;
  int color;
};
void show(int canvas[W][H], Frame fr) {
  for(int j = 0; j < fr.height; j++) {
    for (int i = 0; i < fr.width; i++) {
      if (canvas[i][j] == 0) 
        cout << '.';
      else
        cout << canvas[i][j];
    }
    cout << endl;
  }
  cout << endl;
}
void paint (int canvas[W][H], Frame fr, Brush br,
    int x, int y) 
{
  for(int j = 0; j < fr.height; j++) {
    for (int i = 0; i < fr.width; i++) {
      if ((x-i)*(x-i) + (y-j)*(y-j) <= 
          br.radius * br.radius)
      {
        canvas[i][j] = br.color;
      }
    }
  }
}
int main() {
  int canvas[W][H] = {0};
  Frame frame = {.width=30, .height=15};
  Brush brush = {5.5, 1};
  paint(canvas, frame, brush, 10, 8);
  brush.radius = 3.5;
  paint(canvas, frame, brush, 20, 9);
  
  brush.radius = 3.5; brush.color = 2;
  paint(canvas, frame, brush, 30, 2);
 
  brush.radius = 4.5; brush.color = 0;
  paint(canvas, frame, brush, 15, 7);
  show(canvas, frame);
}
............................22
...........................222
...........................222
........11111..............222
.......11111................22
......11111..................2
.....111111.........11........
.....111111.........111.......
.....111111.........1111......
.....111111.........1111......
.....1111111.......11111......
......1111111.....11111.......
.......1111111.....111........
........11111.................
..............................
In this example, we define two functions make_bigger_brush and make_smaller_brush.
Both of them accept a Brush structure as a parameter and return a new Brush structure
with the same value of the member variable color, but a different value for its radius:
#include <iostream>
using namespace std;
struct Brush {
  double radius;
  int color;
};
// Create a bigger brush
Brush make_bigger_brush (Brush br) {
  
  // a new brush of x2 radius
  Brush br2;
  br2.radius = 2.0 * br.radius;
  br2.color = br.color;
  return br2;
}
// Create a smaller brush
Brush make_smaller_brush (Brush br) {
  
  // a new brush of x0.5 radius, copying the original one
  
  Brush br2 = br; // <-- you can copy the contents of the 
                  //     original brush variable 
                  //     in the new variable br2
                  
  br2.radius = 0.5 * br2.radius; // reduce its radius
  return br2;
}
int main () {
  Brush b1 = {5.0, 1};
  Brush b2 = make_bigger_brush(b1);
  Brush b3 = make_smaller_brush(b1);
  cout << "b1.radius = " << b1.radius << endl; 
  cout << "b1.color = "  << b1.color << endl << endl; 
  cout << "b2.radius = " << b2.radius << endl; 
  cout << "b2.color = "  << b2.color << endl << endl; 
  
  cout << "b3.radius = " << b3.radius << endl; 
  cout << "b3.color = "  << b3.color << endl << endl; 
  return 0;
}
b1.radius = 5
b1.color = 1
b2.radius = 10
b2.color = 1
b3.radius = 2.5
b3.color = 1
Nested structs are fine.
In the following example, we make a struct Canvas that contain the canvas array and the struct Frame.
Notice that we pass this struct by reference to the function paint, because otherwise the array member data
would not be updated by the function (if passed by value, the function would update a copy of the structure
keeping the original structure unchanged).
#include <iostream>
using namespace std;
const int W = 200;
const int H = 200;
struct Frame {
  int width;
  int height;
};
struct Brush {
  double radius;
  int color;
};
struct Canvas {
  Frame frame;
  int data[W][H];
};
void show(Canvas & canvas) {
  for(int j = 0; j < canvas.frame.height; j++) {
    for (int i = 0; i < canvas.frame.width; i++) {
      if (canvas.data[i][j] == 0) 
        cout << '.';
      else
        cout << canvas.data[i][j];
    }
    cout << endl;
  }
  cout << endl;
}
void paint (Canvas & canvas, Brush br, int x, int y) 
{
  for(int j = 0; j < canvas.frame.height; j++) {
    for (int i = 0; i < canvas.frame.width; i++) {
      if ((x-i)*(x-i) + (y-j)*(y-j) <= 
          br.radius * br.radius)
      {
        canvas.data[i][j] = br.color;
      }
    }
  }
}
int main() {
  Canvas canvas = {{30, 15}, {0}};
  Brush brush = {5.5, 1};
  paint(canvas, brush, 10, 8);
  brush.radius = 3.5;
  paint(canvas, brush, 20, 9);
  
  brush.radius = 3.5; brush.color = 2;
  paint(canvas, brush, 30, 2);
 
  brush.radius = 4.5; brush.color = 0;
  paint(canvas, brush, 15, 7);
  show(canvas);
}
............................22
...........................222
...........................222
........11111..............222
.......11111................22
......11111..................2
.....111111.........11........
.....111111.........111.......
.....111111.........1111......
.....111111.........1111......
.....1111111.......11111......
......1111111.....11111.......
.......1111111.....111........
........11111.................
..............................