C語言二維數組


基礎知識

1.二維數組聲明:其中,整形常量表達式1表示第一維的大小(行數);表達式2表示第二維的大小(列數)。可以把a[i]看作特殊的一維數組名。

儲存類型 類型說明符 數組名[整形常量表達式1][整形常量表達式2]

 

2.二維數組儲存:在C語言中,二維數組是按行儲存的,占用的存儲空間大小為 sizeof(類型說明符)*行數*列數。

3.對於b[2][3][4],b是地址常量不能對其賦值;b指向b[0],b[0]指向b[0][0],b[0][0]指向b[0][0][0];b與&b[0]等價,b[0]與&b[0][0]等價,b[0][0]與&b[0][0][0]等價。

4.b+1表示序號為1的行地址;b[0]+1表示b[0]的1號元素(b[0][1])的地址。

5.假設數組float a[3][4]的起始地址為1000,則有如下等價關系:

  • a, *a, a[0], *(a+0), &a[0], &a[0][0]地址值相等,為1000;
  • &a[0][1], a[0]+1, *a+1地址值相等,為1004;
  • a+1, a[1], *(a+1), &a[1], &a[1][0]地址值相等,為1016;
  • a[1][0], *(*(a+1)+0)等價。

6.二維數組初始化:

  • 子常量表相當於以為數組的初值,給出數據個數不能多余一行上元素的個數;
  • 對部分元素賦初值,未被賦值的元素自動置0;
  • 聲明有初值的數組時,可以不指定第一維的大小,由初值的個數確定。
int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12};
int a[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
int a[3][4] = {{1}, {5}, {9}};
int a[][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
int a[][4] = {{0, 0, 1}, {5}, {0, 9}};

 

7.使用指針間接引用二維數組元素:一是直接指向數組元素;二是使用指針指向二維數組的行。

  • 丟失結構信息
#include<stdio.h>
int main(void)
{
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; int *p;
for(p=a[0];p<a[0]+12;p++) printf(“%d ”,*p); }

 

  • 指針數組與數組指針
int (*p)[10]    //數組指針
int *p[10]     //指針數組

 

  • 數組指針:p+i指向a的第i行元素起始地址;*(*(p+i)+j)==p[i][j]
#include <stdio.h>
int main(void)
{
    int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23},k;
    int (*p)[4];   
    for(p=a;p<a+3;p++) 
        for(k=0;k<4;k++) 
                printf(“%d ”,(*p)[k]);
    return 0;
}

 

8.二維數組作函數參數

  • 丟失結構信息
#include <stdio.h>
int max_value(int *b,int n)
{
    int k,max=*b;
    for(k=0;k<n;k++)
if(b[k]>max) max=b[k];
return(max); } int main(void) { int a[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}},max; max=max_value(a[0],12) ; /* 或*a或&a[0][0] */
  printf(“The max value is %d\n”,max);
  return 0; }

 

  • 使用行指針變量
#include <stdio.h>
int max_value(int (*array)[4])/*int array[3][4] 或 int array[ ][4] */
{
int j,k,max=array[0][0]; for(k=0;k<3;k++)
for(j=0;j<4;j++)
if(array[k][j]>max) max=array[k][j];
   return(max); } int main(void) {
int a[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}}; printf(“The max value is %d\n”,max_value(a));
  return 0; }

 

二維數組應用

  1.矩陣轉置

#include <stdio.h>
int main(void)
{
    int i, j, a[2][3] = {{1, 2, 3}, {4, 5, 6}}, b[3][2];
    for (i = 0; i < 2; i++)
        for (j = 0; j < 3; j++)
            b[j][i] = a[i][j];
    printf("array a:\n");
    for (i = 0; i < 2; i++)
    {
        for (j = 0; j < 3; j++)
            printf("% 5d", a[i][j]);
        printf("\n");
    }
    printf("array b: \n");
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 2; j++)
            printf("%5d", b[i][j]);
        printf("\n");
    }
    return 0;
}

 

  2.矩陣乘積

#include <stdio.h>
int main(void)
{
    int a[2][3] = {1, 2, 3, 4, 5, 6}, b[3][4] = {1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6}, c[2][4] = {0}, i, j, k;
    for (i = 0; i < 2; i++)
        for (j = 0; j < 4; j++)
            for (k = 0; k < 3; k++)
                c[i][j] += a[i][k] * b[k][j];
    for (i = 0; i < 2; i++, printf("\n"))
        for (j = 0; j < 4; j++)
            printf("% 4d", c[i][j]);
    return 0;
}

  3.計算3*3矩陣對角元素之和

 

#include <stdio.h>
int matrix(int a[3][3])
{
    int sum = 0, i, j;
    for (i = 0; i < 3; i++)
        for (j = 0; j < 3; j++)
            if (i == j || i + j == 2)
                sum = sum + a[i][j];
    return sum;
}
int main(void)
{
    int a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}, count, i, j;
    count = matrix(a);
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 3; j++)
            printf("%d  ", a[i][j]);
        putchar("\n");
    }
    printf("%d\n", count);
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM