Of course! The error message "pointer expected" in C is a very common compiler error. It means you've tried to use a variable in a context where the C language standard requires a pointer, but the variable you provided is not a pointer.

Let's break down what this means, why it happens, and how to fix it.
The Core Concept: What is a Pointer?
A pointer is a special type of variable that stores a memory address. Instead of holding a value directly (like int i = 10;), it holds the location in memory where another value is stored.
Think of it like this:
- A variable is like a labeled box holding a value.
- A pointer is like a slip of paper that tells you the address of another box.
The declaration of a pointer uses the asterisk () symbol. For example:
int *ptr; declares ptr as a pointer to an integer.

Common Causes of "pointer expected" and How to Fix Them
Here are the most frequent scenarios that trigger this error, with examples.
Passing a Non-Pointer to a Function that Expects a Pointer
This is the most common cause. Many standard C functions (like scanf, strcpy, fopen) need to modify the original variable in the calling function. Since C uses "pass-by-value" (a copy of the variable is passed), the only way to do this is to pass the memory address (a pointer).
Error Example:
#include <stdio.h>
// This function expects a POINTER to an integer so it can change the original value.
void change_value(int *p) {
*p = 100; // *p means "the value AT the address stored in p"
}
int main() {
int my_num = 50;
// ERROR: 'int' is not a pointer type. The function expects 'int *'.
change_value(my_num);
printf("my_num is now: %d\n", my_num); // This line will not compile
return 0;
}
The Fix:

Use the address-of operator (&) to get the memory address of your variable and pass that to the function.
#include <stdio.h>
void change_value(int *p) {
*p = 100;
}
int main() {
int my_num = 50;
// CORRECT: Pass the address of my_num using the '&' operator.
change_value(&my_num);
printf("my_num is now: %d\n", my_num); // Output: my_num is now: 100
return 0;
}
Using scanf Incorrectly
scanf is a classic source of this error. It needs to know where to store the input value it reads from the user, so it requires pointers for all its arguments (except for the format string).
Error Example:
#include <stdio.h>
int main() {
int age;
char name[50];
// ERROR: scanf expects the address of 'age', not 'age' itself.
scanf("%d", age);
// ERROR: For strings (arrays), the array name 'name' already decays to a pointer,
// so you don't need '&'. But this is a different error (lvalue required).
// The first error is the one we're focusing on.
printf("You entered: %d\n", age);
return 0;
}
The Fix:
Use the & operator for non-array variables like int, float, char, etc.
#include <stdio.h>
int main() {
int age;
char name[50];
// CORRECT: Pass the address of 'age' using '&'.
scanf("%d", &age);
// CORRECT: For an array, 'name' already points to its first element.
scanf("%s", name);
printf("You entered: %d and %s\n", age, name);
return 0;
}
Using sizeof on a Pointer Instead of the Type it Points To
The sizeof operator gives you the size of a type or variable. If you have a pointer, sizeof will tell you the size of the pointer itself (e.g., 4 or 8 bytes on a modern system), not the size of the data it points to. If you want the size of the data, you must dereference the pointer first.
Error Example:
#include <stdio.h>
int main() {
int arr[10];
int *ptr = arr;
// This is not an error, but it's a common logical mistake.
// It will print the size of a pointer (e.g., 8), not the size of the array.
printf("Size of pointer: %zu\n", sizeof(ptr));
// Let's say you have a function that needs the size of the *data*.
void process_data(int *data, int size) {
// ... do something ...
}
// If you accidentally pass sizeof(ptr), you get the wrong size.
process_data(ptr, sizeof(ptr)); // This will likely cause a buffer overflow later.
return 0;
}
The Fix:
If you need the size of the type the pointer points to, dereference the pointer with before passing it to sizeof.
#include <stdio.h>
int main() {
int arr[10];
int *ptr = arr;
// CORRECT: To get the size of the data type the pointer points to.
// sizeof(*ptr) is equivalent to sizeof(int).
printf("Size of int: %zu\n", sizeof(*ptr));
// CORRECT: Pass the correct size to the function.
process_data(ptr, sizeof(*ptr));
return 0;
}
Dereferencing a Non-Pointer Variable
You use the asterisk () to "dereference" a pointer, which means to access the value stored at the memory address it holds. If you try to dereference a regular variable, the compiler will complain because that variable doesn't hold an address.
Error Example:
#include <stdio.h>
int main() {
int my_num = 10;
int another_num = 20;
// ERROR: 'my_num' is an int, not a pointer. You can't "dereference" it.
int *ptr = &my_num;
*my_num = 25; // Compiler error: expression must be a pointer-to-object type
return 0;
}
The Fix:
Make sure you only use the operator on variables that are pointers.
#include <stdio.h>
int main() {
int my_num = 10;
int another_num = 20;
// CORRECT: 'ptr' is a pointer. Dereferencing it changes the value of my_num.
int *ptr = &my_num;
*ptr = 25;
printf("my_num is now: %d\n", my_num); // Output: my_num is now: 25
return 0;
}
Summary: How to Debug "pointer expected"
- Look at the Error Line: Find the exact line in your code where the compiler is complaining.
- Identify the Context: What are you trying to do on that line? Are you calling a function? Using
sizeof? Dereferencing with ? - Check the Function Signature: If it's a function call, look up the function's definition or documentation (e.g.,
man scanf). Does it expect a pointer (e.g.,int *,char *)? - Apply the Correct Operator:
- If the function expects a pointer but you have a variable, use the address-of operator (
&). - If you want to get the value from a pointer, use the *dereference operator (``)**.
- If you want the size of the data a pointer points to, use
sizeof(*ptr).
- If the function expects a pointer but you have a variable, use the address-of operator (
By understanding these fundamental pointer concepts, you can quickly identify and fix this common error.
