数组与指针

指针与数组有着非常密切的关系,下面我们一起来学习指针在一维数组以及多维数组中的应用。

一维数组的指针应用

数组名称代表其自身的基地址。
arr_num = 数组的基地址 = &arr_num [0]
array_index_1

arr_num和&arr_num [0]之间的区别

#include <stdio.h>
 
int main()
{
    int arr_num[]={10,20,30,40,50};

    if(arr_num==&arr_num[0])
    {
        printf("arr_num 和 &arr_num[0] 相同");
    }
    else
    {
        printf("arr_num 和 &arr_num[0] 不同");
    }
    return 0;
}

运行结果:

arr_num 和 &arr_num[0] 相同

数组指针的增量

利用数组的连续存储功能,通过步进连续的内存位置,我们可以通过指针变量访问每个元素。

注意:必须注意使用(*)操作符。
例如:
字符数组指针的增量:
arrayadress
因为此数组是char数据类型,而char数据类型仅需要1字节存储。因此我们每个元素都存储在1字节空间中。
char指针将以单个字节增量步进。如下所示

#include<stdio.h>
 
int main()
{
    char name[]={'A','m','i','t'};
    char *ptr_name;
    int i;

    ptr_name=name;  /*as name=&name[0]*/
    for(i=0;i<5;i++)
    {
      printf("Address of %dth index = %p\n",i,&name[i]);
    }

    for(i=0;i<4;i++)
    {
      printf("Value at Index %d =%c\n",i,*(ptr_name+i));
    }
     return 0;
    }

输出结果:

字符数组指针应用

说明:

对于i = 0:*(ptr_name + i)= *(name + 0)= *(&name [0] +0)= *(0028FF14 + 0)= *(0x0028FF14)= 10

对于i = 1:*(ptr_name + 1)= *(name + 1)= *(&name [0] +1)= *(0028FF14 + 1)= *(0x0028FF15) = 20

整数数组指针的增量
假设我们定义了一个整型数组:unsigned int arr_num [5] = {10,20,30,40,50};
以上数组的内存分配是这样的:

整型数组指针应用

让我们通过程序查看地址。

#include<stdio.h>
 
int main()
{
    unsigned int arr_num[]={10,20,30,40,50};
    unsigned int *ptr_arr;
    int i;

    ptr_arr=arr_num;  /*as arr_num=&arr_num[0]*/
    for(i=0;i<5;i++)
    {
        printf("Address of %dth index = %p\n",i,&arr_num[i]);
    }

    for(i=0;i<5;i++)
    {
        printf("Value at Index %d =%u\n",i,*(ptr_arr+i));
    }
     return 0;
}

输出结果:

整型数组指针应用

说明:

对于i=0  :  *(ptr_arr+i) = *(arr_num+0)= *(&arr_num[0]+0) =*(0028FF04+0)=
*(0x0028FF04)=10

对于i=1  :  *(ptr_arr+1) = *(arr_num+1)= *(&arr_num[0]+1) =*(0028FF04+1)=
*(0x0028FF08)=20

对于i=2  :  *(ptr_arr+2) = *(arr_num+2)= *(&arr_num[0]+2) =*(0028FF04+2)=
*(0x0028FF0C)=30.

二维数组的指针应用

尽管二维数组有多行,但其内存映射与一维数组一样是线性的。请参见下图。

二维数组表示

2x2_matrix

二维数组存储图

2-d-array_IDX--1
由上图可知,二维数组在内存中存储的方式与一维数组相同,因此我们可以像一维数组那样通过指针访问每个元素。

二维数组指针使用要点

arr =&arr =&arr[0] =&arr[0][0] =数组的基地址。
arr =&arr[0] =表示一维数组block1的基地址。
&arr[0][0] =表示第0行和第0列的地址。
&arr =代表完整矩阵的基址。

请参考下图,了解arr,&arr,&arr[0],&arr[0][0]的物理含义。
2-D-ArrayAddressIncrement
程序
以下程序用于理解arr,&arr,&arr[0],&arr[0][0]意义和指针增量与地址移动关系。

#include <stdio.h>
 
int main()
{
 
    unsigned int arr[2][3]={{10,20,30},{40,50,60}};

    printf("\nAddress of &arr is = %u\n",&arr);
    printf("\nAddress of (&arr+1) is = %u\n",&arr+1);

    printf("\nAddress of arr is = %u\n",arr);
    printf("\nAddress of (arr+1) is = %u\n",arr+1);

    printf("\nAddress of &arr[0] is = %u\n",&arr[0]);
    printf("\nAddress of (&arr[0]+1) is = %u\n",&arr[0]+1);

    printf("\nAddress of &arr[0][0] is = %u\n",&arr[0][0]);
    printf("\nAddress of (&arr[0][0]+1) is = %u\n",&arr[0][0]+1);

    return 0;
}

输出结果:

整型数组指针应用
下一节