二維數組作為函數參數的幾種方法


給定程序中,函數fun的功能是:有N×N矩陣,以主對角線為對稱線,對稱元素相加並將結果存放在左下三角元素中,右上三角元素置為0。
**例如,若N=5,有下列矩陣: 1 2 3 4 5 計算結果為:1 0 0 0 0*/

#include <stdio.h> #define N 5 void fun1(int a[N][N]) { int i,j; for (i=0;i<N;i++) { for (j=0;j<N;j++) { if (i>j) { a[i][j]+=a[j][i]; a[j][i]=0; } } } }
void fun2(int **a,int m,int n) { int i,j; for (i=0;i<m;i++) { for (j=0;j<n;j++) { if (i>j) { *((int *)a+i*m+j)+=*((int *)a+j*m+i); *((int *)a+j*m+i)=0; } } } } void fun3(int *a,int m,int n) //數組按行存儲,可以看做一位數組,存取位置要自己控制
{
int i,j; for (i=0;i<m;i++) { for (j=0;j<n;j++) { if (i>j) { *(a+i*m+j)+=*(a+j*m+i); *(a+j*m+i)=0; } } } } int main() { int b[5][5]={{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7},{4,5,6,7,8},{5,6,7,8,9}}; //fun1(b); //fun2((int **)b,5,5); fun3(*b,5,5); for (int i=0;i<5;i++) { for (int j=0;j<5;j++) { printf("%3d ",b[i][j]); } printf("\n"); } return 0; }

//數組按行存儲

如果二維數組知道一維長度,只有一個維數長度為變量,可以用數組指針。

數組名的指針,即數組首元素地址的指針。即是指向數組的指針。
例:int (*p)[10]; p即為指向數組的指針,又稱數組指針。
int a[4][5];int (*p)[5]=a;
void fun4(int (*a)[5],int m)
{
    int i,j;
    for (i=0;i<m;i++)
    {
        for (j=0;j<5;j++)
        {
            if (i>j)
            {
                *(*(a+i)+j)+=*(a[j]+i);
                *(a[j]+i)=0;

            }
        }
    }
    
}

int (*p1)[5];
    int **p2;
我覺得上面兩個相似。只有一些小小的不同..
p1指向一維數組的指針

p2是一個指向指針的指針,沒有自己的內存區域。可以隨意指向任意一塊內存區域.


免責聲明!

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



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