Nitpicky but:
The remaining arguments &haystack, &haystack_len, &needle, &offset specify the variables to put the arguments into. As you can see, they are all passed by reference (&), which means that not the variables themselves are passed, but pointers to them.
References aren't pointers, they
are the variables. The address of the variable itself gets passed with a reference, whereas a pointer is a variable containing the address of the variable. A pointer itself has an address. A very subtle yet important difference.