数组与指针

数组

指针

一维数组与指针

//求数组中元素之和
int sum(int a[], int n)
{
    int i = 0;                  //循环标记
    int total = 0;              //和
    for ( i = 0; i < n; i++) {    //求和
        total += a[i];
    }
    printf("The size of a is %u bytes. \n", sizeof(a));
    return total;                //返回 和
}

上面代码表示对数组元素求和,利用数组的下标取数组中每个元素的值。

//求数组元素之和
int sump(int *start, int *end)
{
int total = 0;                    //和
while (start < end) {
    total += (*start);          //把值累加的total上
    start++;                    //把指针指向下一个元素
    }
    return total;
}

上面代码表示对数组元素求和,利用指针取数组中每个元素的值。

二维数组与指针

//统计所有年份的总降水量
float getYearsTotalRainfall(float rain[][MONTHS])
{
    int y,m;    //循环标记
    float total = 0;
    float temp;
    for (y = 0; y < YEARS; y++) {
        for (m = 0; m < MONTHS; m++) {
            //temp = rain[y][m];
            //temp = *(&rain[0][0] + y*MONTHS + m);
            temp = *(*(rain+y)+m);
            total += temp;
        }
    }
    return total;
}

float getYearsTotalRainfall2(float *prain, int years, int months)
{
    int y,m;    //循环标记
    float total = 0;
    float temp;
    for (y = 0; y < years; y++) {
        for (m = 0; m < months; m++) {
            //temp = rain[y][m];
            //temp = *(&rain[0][0] + y*months + m);
            temp = *prain++;
            total += temp;
        }
    }
    return total;
}

代码中列出了3种基本取二维数组(i,j)处的值的表示方法

temp = rain[y][m];                      //1. 用下标取(i,j)处的值
temp = *(&rain[0][0] + y*MONTHS + m);   //2. 用指针来取值
temp = *(*(rain+y)+m);                  //3. 用指针来取值

通过地址来引用二维数组元素若有以下定义:
int a[3][4],i,j;且当0≤i<3、0≤j<4,则a数组元素可用以下五种表达式来引用:

  1. a[i][j]
  2. *(a[i]+j)
  3. ((a+i)+j)
  4. (*(a+i))[j]
  5. (&a[0][0]+4i+j)

参考

  1. 二维数组和指针(C语言)