File Pointer is the most widely used and standardized, however, File Descriptor is a low level kernel variable and limited to Linux.

Deeper Understanding - At the Kernel level

The Kernel maintains a Kernel File Table for every open file by any process. Each entry in this kernel file table is identified by our File Descriptor. Hence, any file opened by any process would have a file descriptor and that file would have its entry maintained in the kernel file table until it is closed. Another interesting fact is, even if the same file on the disk is opened by two different processes, they would have their own separate file table entries in the kernel file table with separate file descriptor values. This is needed to store the mode of open, current file position, etc for each opened instance of the file.

Generally, an entry in the kernel file table would consist of:

File Descriptor

Current File Position

inode info

vnode info

file metadata

etc

However, every process also has its own File Descriptor (FD) table, which is basically a data structure identifying the opened file instance and includes a pointer to the entry in the kernel file table. Each entry in this FD table is of the opened file in the process.

At the userspace level, the file pointer is used to read/write onto a file. Whereas, at the system level, it uses the lower level variable file descriptor.
Here is an abstract illustration:

So, when we write the code

Code:

1. File *fp;
2. fp = fopen ("/etc/myfile.txt", "w");
3. fclose(fp);

In statement 1, a 4 byte memory for the pointer is created of type 'FILE' on stack.
In statement 2, a memory = 'sizeof(FILE)' is allocated on heap, and address of which is assigned to the pointer 'fp'.
Along with, a new entry created in the FD table of the process followed by, an entry created in the kernel file table representing the newly opened file instance having a unique FD.

During the read/write/other IO operations, values are maintained by the Kernel File Table entry.

In statement 3, all the allocated memory for file pointer is released and the entry is deleted.

Conclusion

Now we know what internally file descriptor and file pointer is, and how they work in their respective spaces. Also, we know how to get one from the other. So, keep playing and exploring and share any interesting fact you get across.