In-depth Analysis of Pointers and Array Addresses in C

Nov 23, 2025 · Programming · 12 views · 7.8

Keywords: C Language | Pointers | Array Addresses

Abstract: This article delves into the relationship between array names and pointers in C, using code examples to analyze array addresses, pointer type compatibility, and printf formatting specifications. It explains why array names can often be treated as pointers to their first elements, but &array yields a pointer to the entire array with type array_type(*)[size]. The discussion covers the causes of GCC compiler warnings and solutions, including correct pointer declarations and the necessity of void* casting for printing, helping readers fundamentally understand how pointers and arrays are represented in memory.

Basic Concepts of Array Names and Pointers

In C, an array name in most expressions decays to a pointer to its first element. For example, given the declaration char s[] = "asd";, the array name s in value context is equivalent to &s[0], with type char*. However, when the address-of operator & is applied to the array name, the behavior differs. &s yields a pointer to the entire array, with type char(*)[4] (pointer to an array of 4 characters), not char**.

Code Example and Compiler Warning Analysis

Consider the following code snippet:

#include <stdio.h>

int main(void)
{
    char s[] = "asd";
    char **p = &s; // Warning: incompatible pointer type

    printf("The value of s is: %p\n", s);
    printf("The direction of s is: %p\n", &s);
    // More printf statements...
    return 0;
}

Compiling with GCC produces several warnings:

Corrected Code and Detailed Explanation

To properly declare pointers and avoid warnings, distinguish between array pointers and pointer-to-pointers:

char s[] = "asd";
char *p = &s[0]; // Or shorthand: char *p = s;
char **pp = &p;

Here, p points to the first element of the array, with type char*; pp points to the pointer p, with type char**. For printf, it is advisable to cast pointers to void*:

printf("The value of s is: %p\n", (void *) s);
printf("The direction of s is: %p\n", (void *) &s);

Runtime Output and Memory Layout Analysis

The program output shows:

The value of s is: 0xbfb7c860
The direction of s is: 0xbfb7c860
The value of p is: 0xbfb7c860
The direction of p is: 0xbfb7c85c

The values of s and &s are the same (both 0xbfb7c860) because the starting address of the array coincides numerically with the address of its first element. However, their types differ: s in value context is char*, while &s is char(*)[4]. The address of pointer p (&p) is 0xbfb7c85c, adjacent to the array address, consistent with stack memory layout.

Summary and Best Practices

Understanding array names and pointers hinges on distinguishing types and values: array names typically decay to pointers in expressions, but &array produces a pointer to the entire array. Under C89/C90 standards, always cast pointers to void* when printing with %p to avoid undefined behavior. Proper pointer declaration and handling of type compatibility are essential for avoiding compiler warnings and ensuring program portability.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.