Assuming val_1, val_2 and temp are of type Record, the swap looks like it should work.
Other parts of the code do give me cause for concern.
Anyway, perhaps you could clarify, when you say "I'm not having much luck", could you be more specific please. If there's an error message then please post it here in full. If the code runs but doesn't work, then please say what happens.
Ok, Chervil you caused me to redouble my efforts on the pointer type. Analysis showed I was creating 2 pointers each for one of two struct types. Errant. So I created 2 pointers same type both pointing at 1 struct object and it worked. Now I have 2 different pointers for same struct - great!
Snippet
1 2 3 4 5 6 7
...
Record * n_ptr = new Record[num_students];
Record * n_temp; // previously Temp * n_temp
n_temp = n_ptr;
...
bubblesort_grades(n_ptr, num_students, n_temp);
...
Snippet
This snippet is a placeholder for bubblesort fx, not meant to be the actual one.
1 2 3
void bubblesort_grades(Record * n_ptr, int &num_students, Record * n_temp)
...
The reason why this won't work val_3 = n_ptr[1].student_grade;
is a mismatch of types.
val_3 is a Record.
n_ptr[1] is a Record as well
but
n_ptr[1].student_grade is an int
It is an attempt to assign a value of type int to a variable of type Record.
Not only are the types incompatible, but also, it was almost certainly not what you were intending to do, in other words the fact that an error is occurs is good, it helps you to spot your mistakes.