程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> C 語言 關於二維數組 傳參 總結

C 語言 關於二維數組 傳參 總結

編輯:關於C
 最近做矩陣運算處理,依據以往的懶想法,想直接搞一個 函數,可以傳遞 任何維數的矩陣進行運算。
 
所以,聲明了這樣一個函數:     void matrix_mult(float **p); 
 
然後再主函數中 聲明了 一個 二維數組float a[3][3];
 
進而在使用時這樣:matrix_mult(a);
 
之後悲劇,編譯器提示:cannot convert parameter 1 from 'float [3][3]' to 'float ** '
 
有錯誤。
 
改正方法:
 
matrix_mult(float (*p)[N]);//N 為聲明二維數組第二維的大小值,然後再進行傳參:matrix_mult(a);OK了。
 
 
總結:這是一個老生常談的問題:關於數組和指針
 
說明:
 
指針是一個變量名,而數組不是變量名,數組跟接近於一種結構體。
 
例子:
 
int *p; int a[2]; p = a;
int n = sizeof(p);//
 
int len = sizeof(a);
 
n 的值為4,而len的值為8;
 
 
int a[10][20]; //真正的二維數組,
 
int *b[10];  //定義分配了10個指針,沒有初始化。換句話說,b是一個由10個整型(int)指針構成的指針數組。
 
int (*p)[3];//指向數組的指針
 
int (*p)();//指向函數的指針
 
int *p();//p是一個函數,返回值是一個int型指針
 
 
float ** 這裡的p不是二維數組的指針,而是指向指針的指針,即二級指針。
正確的二維數組的指針應該是:Int a[2][2];Int (*p)[2];//定義時無論數組維數,只可忽略第一維
 
 
 
二維數組其實只是一個指針,而二級指針是指向指針的指針,所以二者並不等價
 
 
 
附:code
 
/*----------------------------------------------------------------------------------*/
 
/*說明:此函數可以直接進行矩陣3x3的乘法,經過驗證                              */
 
/*----------------------------------------------------------------------------------*/
 
#include "stdlib.h"
#include "stdio.h"
#include "math.h"
 
 
void matrix_mult(float (*a)[3], float (*b)[3], float (*c)[3]);
void matrix_init(float (*a)[3]);
 
 
 
 
float a[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
float b[3][3] = {2, 3, 4, 5, 6, 7, 8, 9, 1};
float c[3][3] = {0};
 
 
 
int main()
{
int i , j;
 
 
int t[2];
int *p;
p = t;
 
 
int n = sizeof(p);
int len = sizeof(t);
 
 
printf("原始數組C的值為:\n");
for(i = 0; i < 3; i++)
{
for(j = 0; j < 3; j++)
{
printf("%f ", c[i][j]);
}
printf("\n");
}
printf("\n");
 
 
printf("原始數組A的值為:\n");
for(i = 0; i < 3; i++)
{
for(j = 0; j < 3; j++)
{
printf("%f ", a[i][j]);
}
printf("\n");
}
printf("\n");
 
 
printf("原始數組B的值為:\n");
for(i = 0; i < 3; i++)
{
for(j = 0; j < 3; j++)
{
printf("%f ", b[i][j]);
}
printf("\n");
}
printf("\n");
 
//初始化數據
matrix_init(c);//matrix_init((*c)[3]);
 
 
//matrix_init((*c)[3]);
printf("初始化數組C的值為:\n");
for(i = 0; i < 3; i++)
{
for(j = 0; j < 3; j++)
{
printf("%f ", c[i][j]);
}
printf("\n");
}
printf("\n");
 
matrix_mult(a, b, c);//matrix_mult(float (*a)[3], float (*b)[3], float (*c)[3])
//matrix_mult((*a)[3], (*b)[3], (*c)[3]);
printf("相乘後數組C的值為:\n");
for(i = 0; i < 3; i++)
{
for(j = 0; j < 3; j++)
{
printf("%f ", c[i][j]);
}
printf("\n");
}
printf("\n");
 
 
return 0;
 
}
 
 
void matrix_mult(float (*a)[3], float (*b)[3], float (*c)[3])
{
int i, j, k;
 
for(i = 0; i < 3; i++)
{
for(j = 0; j < 3; j++)
{
for(k = 0; k < 3; k++)
{
c[i][j] += a[i][k] * b[k][j];
}
}
}
 
}
 
 
 
 
void matrix_init(float (*a)[3])
{
int i = 3;
int j = 3; www.2cto.com
 
for(i = 2; i >= 0; i--)
{
for(j = 2; j >= 0; j--)
{
a[i][j] = 0;
}
}
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved