Difference between x and &x in c
Categories:
Understanding x vs. &x in C: Variables, Values, and Addresses

Explore the fundamental difference between a variable's value (x) and its memory address (&x) in C programming, crucial for mastering pointers.
In C programming, understanding how variables are stored in memory is fundamental, especially when working with pointers. Two seemingly similar notations, x and &x, represent vastly different concepts: the value stored in a variable and the memory address where that value resides. This article will demystify these concepts, explain their roles, and illustrate their usage with practical examples.
The Variable x: Accessing the Value
When you declare a variable in C, say int x = 10;, the identifier x directly refers to the value stored in that memory location. Any operation performed directly on x manipulates this value. For example, printf("%d", x); will print the integer value 10 to the console. This is the most common and intuitive way to interact with variables.
#include <stdio.h>
int main() {
int x = 10; // Declare an integer variable x and initialize it to 10
printf("The value of x is: %d\n", x); // Access and print the value of x
x = 20; // Modify the value of x
printf("The new value of x is: %d\n", x); // Access and print the new value
return 0;
}
Demonstrating direct access and modification of a variable's value using x.
The Address-of Operator &x: Obtaining the Memory Location
The & symbol, when placed before a variable name (e.g., &x), is known as the address-of operator. Its purpose is to return the memory address where the variable x is stored. This address is a unique identifier for that specific memory location within the computer's RAM. Understanding memory addresses is crucial for working with pointers, as pointers are variables designed to store these addresses.
#include <stdio.h>
int main() {
int x = 10;
printf("The value of x is: %d\n", x); // Prints the value (e.g., 10)
printf("The address of x is: %p\n", &x); // Prints the memory address of x
return 0;
}
Using the & operator to retrieve and print the memory address of variable x.
%p format specifier in printf is used to print memory addresses. The output format (e.g., hexadecimal) may vary depending on your system and compiler.The Relationship: Pointers Bridge the Gap
The true power of &x becomes apparent when combined with pointers. A pointer variable (e.g., int *ptr;) is declared to hold a memory address. You can assign the address of x to ptr using ptr = &x;. Once ptr holds the address of x, you can use the dereference operator (*) with ptr to access or modify the value at that address. This means *ptr is equivalent to x.
flowchart TD
subgraph Memory
A["Memory Location (e.g., 0x7ffee...) "]
B["Value: 10"]
end
C["int x = 10;"] --> D["Variable 'x'"]
D --> B
D -- "refers to value" --> B
E["&x"] -- "returns address" --> A
F["int *ptr = &x;"] --> G["Pointer 'ptr'"]
G -- "stores address" --> A
H["*ptr"] -- "dereferences to value" --> BRelationship between variable x, its address &x, and a pointer ptr.
#include <stdio.h>
int main() {
int x = 10; // Variable x with value 10
int *ptr; // Pointer variable ptr
ptr = &x; // ptr now stores the address of x
printf("Value of x: %d\n", x); // Direct access to value
printf("Address of x: %p\n", &x); // Address of x
printf("Value of ptr (address it holds): %p\n", ptr); // Value of ptr is x's address
printf("Value at address held by ptr (*ptr): %d\n", *ptr); // Dereferencing ptr to get x's value
*ptr = 25; // Modify the value at the address ptr holds (which is x's address)
printf("New value of x after *ptr = 25: %d\n", x); // x's value has changed
return 0;
}
Illustrating how pointers use &x to store addresses and *ptr to access values.
& operator can only be applied to lvalues (expressions that identify a memory location, like variables). You cannot take the address of a literal constant (e.g., &10) or a temporary expression.Summary of Differences
To summarize, x and &x are two distinct but related concepts essential for understanding memory management and pointers in C. Mastering this distinction is a cornerstone for advanced C programming techniques, including dynamic memory allocation, passing arguments by reference, and building complex data structures.

Direct comparison of x (value) and &x (address).