Related answers:
How does a struct instance's virtual method get located using its type object in heap?
How boxing a value type work internally in C#?
Is everything in .NET an object?
As said by @ Damien_The_Unbeliever, what follows is only valid for current computing technologies because .NET is a virtual platform. Actually and on Intel-like microprocessors (x86, x32, x64 and similar) since the CPU beginning and the invention of the stack registers, the behavior is like it is. But in the future, underlying things may be different with any other tech gen like quantum.
Instances of struct as members of a class are allocated with the object itself, so in the heap, but a local struct variable declared in a method is allocated in the stack.
Also, variables passed as parameters for a method always use the stack: reference as well as content of structures are PUSHed and POPed, therefore the limit of structures and anonymous types that are recommended to not be over used and to not be too big.
To simplify things and to understand, imagine that the heap is a whole room and the stack is a cupboard in this room.
This cupboard is for local value-types variables and references used to run the program, as well as to pass data between methods and to get results of these methods when they are functions and not procedures: references, value types, integral types, structs content, anonymous types and delegates are PUSHed and POPed to and from this cupboard as a temporary container.
The room is for objects themselves (we pass references of objects), except structs alone which are not in objects (we pass all the struct content, and it is the same when we pass a struct that is in a class, we pass the entire struct as a copy).
For example:
class MyClass
{
MyStruct MyVar;
}
Is a struct variable "not alone" created in the head with the object when created anywhere.
But:
void MyMethod()
{
MyStruct MyVar;
}
Is a local "alone" instance of the struct created in the stack as well as integers.
Thus if a class has 10 integers, only the reference is PUSHed in the stack when calling a method (4 bytes on x32 and 8 bytes on x64). But if it were a struct, it requires to PUSH 10 integers (40 bytes on x32 as well as x64).
In other words as you wrote: So then struct instances alone (thus, assigned to a local variable of struct type) are not stored in the Heap. But members of a class (thus, assigned to a field of struct type) are stored in the Heap.
That said:
Members (integral numeric and references pointer "values") of a struct in the heap are accessed using direct memory access using MOV
opcodes and equivalent (virtual or targetted machine code).
Members of a struct in the stack are accessed using the stack register base+offset.
First is slow and second is faster.
How would the memory look like for this object?
What and where are the stack and heap?
Stack and heap in c sharp
Memory allocation: Stack vs Heap?
Stack and Heap allocation
Stack and Heap memory
Why methods return just one kind of parameter in normal conditions?
List of CIL instructions
.NET OpCodes Class
Stack register
The Concept of Stack and Its Usage in Microprocessors
Introduction of Stack based CPU Organization
What is the role of stack in a microprocessor?
To understand better and to improve your skills in computing, you may found interesting to investigate what is assembly language and how work the CPU. You can start with IL and modern Intel but it may be simpler, formative and complementary to start from the past 8086 to i386/i486.