 Remember this code where we can't change the value of an argument because arguments are passed by value? But scanF can change the value of an argument by passing its address using the address of operator. ScanF accomplishes this magic behind the scenes by using a concept called pointers. And in this video, you're going to find out how you can use pointers in your code to work the same sort of magic. Here's a program where we'd like to change the value of the price parameter. That means we have to pass not the value of the variable, but its address. We do that by putting the address of operator on the argument. What gets passed to the half price function now isn't the value in the price variable, but the address of the price variable. And that is not a double. It's the address of a double, also called a pointer to a double variable. And you specify that it's a pointer by preceding the parameter name with an asterisk. Because a mount is now a pointer, an address, we can't divide it by two. That doesn't make any sense. Instead, we have to use the asterisk operator again. In this context, it means follow the pointer and get the value from that address. Let's look at this assignment statement in detail. When the right-hand side of the assignment is handled, star amount follows the pointer and gets the value from the original address, 20.00. And divides that by two, which gets a result of 10 for the right-hand side. The left-hand side says, instead of storing the value 10 in the amount variable, follow the pointer and store the value there. The half price function ends, and we continue to the next statement in main, and the original argument has been changed. Because the address was passed and the function followed the pointer back to the original. In this function, amount is a pointer to double. And when you access the value by following the pointer, it's called dereferencing the pointer. One additional note. When you use pointers, you can change the value of an argument. For primitive values such as integers and doubles, this is not common. Instead, it's more typical to have a function return a new value and replace the original in the calling function. Scan if uses pointers because it must update the argument in place. In the next videos, we'll see places where using pointers is either more convenient than returning new values or where their use is encouraged.