首页 > 编程笔记

C语言数组指针的使用(非常详细)

在程序实际开发中,数组的使用非常普遍。根据数组占据内存中连续的存储区域这样一个性质,建立起指针和数组的关系,使用指针将使我们操作数组元素的手段更加丰富。本文将详细介绍利用C语言指针变量对数组进行操作。

C语言数组指针

当指针变量里存放一个数组的首地址时,此指针变量称为指向数组的指针变量,简称数组指针。

可以定义指针变量指向任意一个数组元素。例如:

int a[5],*p;
p = &a[0]; 或 p = a;

则 p+1 指向 a[1],p+2 指向 a[2]。

通过指针引用数组元素:*p 就是 a[0],*(p+1) 就是 a[1]……*(p+i) 就是 a[i]。

当一个指针变量指向了一个数组后,就可以利用指针变量对数组元素进行输入、输出和各种数据处理了。例如:
#include<stdio.h>
int main( void)
{
    int i, a[ ] = { 1, 3, 5, 7, 9 }
    int *p = a;
    for ( i = 0; i < 5; i++ )
        printf( "%d\t", *( p + i ) );
    printf( "\n" );
}

C语言数组指针作为函数参数

指向数组的指针可以作为函数形参,对应实参为数组名或已初始化的指针变量,此时可以通过“地址传递”实现数据的双向传递。

【示例1】编写一个函数,将数组中 10 个整数倒序输出。C语言代码如下:
#include <stdio.h>    
void inv( int *x, int n );
int main()                                        
{
    int i,a[ ] = { 3, 7, 9, 11, 0, 6, 7, 5, 4, 2 };          
    printf(  "The original array:\n" );           
    for( i = 0; i < 10; i++) 
        printf( "%3d", a[i] );
    printf(  "\n" );   
    inv( a,10 );                                 
    printf(  "The array has been inverted:\n" );  
    for( i = 0; i < 10; i++ )
        printf( "%3d", a[i] );
    printf(  "\n" );
}
void inv( int *x, int n )
{  
    int t,*i,*j;                              
    for(i = x, j = x + n - 1; i <= j; i++, j-- )             
    { 
        t = *i;
        *i = *j;
        *j = t;
    }                     
}
运行结果:

The original array:
  3  7  9 11  0  6  7  5  4  2
The array has been inverted:
  2  4  5  7  6  0 11  9  7  3

本例程序的颠倒顺序采取从首尾开始、数组前后相对元素互换数值的方法。定义两个指针变量 i 和 j,分别指向数组开头和结尾,对向扫描交换数值。当 i>j 时扫描结束。

C语言指针与字符数组

指针变量可以直接用来处理字符串,用指针变量处理字符串有其独特之处。

字符数组法:

char string[ ] = "name";
printf( "%s\n", string );
或:  for ( i = 0; i < 5; i++ )
printf( "%c",  string[ i ] );

归纳总结

在绝大多数表达式中,C语言数组名的值是指向数组第一个元素的指针。这个规则只有两个例外:sizeof 返回整个数组所占用的字节而不是一个指针所占用的字节;单目运算符 & 返回一个指向数组的指针,而不是一个指向数组第一个元素的指针的指针。

指针和数组并不相等。数组的属性和指针的属性大相径庭。当我们声明一个数组时,它同时也分配了一些内存空间,用于容纳数组元素。但是,当我们声明一个指针时,它只分配了用于容纳指针本身的空间。

当数组名作为函数参数传递时,实际传递给函数的是一个指向数组第一个元素的指针。对指针参数执行间接访问操作允许函数修改原先的数组元素。数组形参既可以声明为数组,也可以声明为指针。这两种声明形式只有当它们作为函数的形参时才是相等的。

优秀文章