指針與多元數組
int coco[3][2]; //先定義一個二維數組
在這個數組中,coco是一個占有兩個int類型大小的位址;coco[0]是一個占有一個int類型大小的位址
對二維數組的了解
coco==&coco[0] //兩者是相等的
/*二維數組可以看出兩個一維數組,一個一維數組包括了第二個一維數組
這裡coco就是這個二維數組的第一個一維數組的數組名,同時coco[0]就是這個一維數組的第一個元素(一個數組元素)
把coco[0]當成二維數組的第二個一維數組的數組名,coco[0][0]就是這個一維數組的第一個元素(一個int元素)
是以此時coco這個變量名是個位址,coco[0]這個變量名也是一個位址*/
同時coco和coco[0]兩者表示的内容都是這個數組的第一個元素,這也是它們為什麼位址相同
數組的元素下标越界問題
在數組中,數組的元素是連續存儲的,是以隻要下标引用的元素沒有超過存儲的範圍,在那個位置還有元素在,就能得到那個位置的元素;而超過了存儲的範圍,就隻能得到未知數
例:
include<stdio.h>
#include<stdlib.h>
int main(void)
{
int Cp[2][2]={8,9,10}; //隻有一個存儲單元,元素連續存儲
int *p1=Cp[0];
printf("%d\n%d",*p1,*(p1+2)); //輸出的結果未8和10
system("pause");
return 0;
}
在多元數組中,就有些不同了。即使每個存儲單元中使用者沒有輸入資料,也會預設為0
例:
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int Ar[2][2]={{1},{2,3}}; //花括号中元素欠缺的部分預設為0
int Cp[3][2]={{8},{},{5,4}}; //3個存儲單元,元素不連續存儲
int *p=Ar[0];
int *p1=Cp[0];
printf("%d\n%d",*p,*(p+2)); //輸出的結果為1和2
printf("%d\n%d",*p1,*(p1+5)); //輸出的結果為8和4
system("pause");
return 0;
}
指針與多元數組的使用
例:
#include<stdio.h>
//void fun(int p1[][3]) 與下面的定義相同,第一個[]表示p1是指針
//void fun(int p1[2][3]) 有效,但3會被忽視
void fun(int (*p1)[3]) //定義一個指向3個int的指針
{
p1[1][2]=7;
//這裡不用傳回,使用void類型
}
void main(void)
{
int arr[2][3]={{1,2,5},{3,4,6}};
int **p1;
p1=arr;
fun(p1);
printf("%d",arr[1][2]);
}
使用指針處理二維數組函數
//聲明兩個子函數來求元素“每一行”和“每一列”的總和
#include<stdio.h>
#include<stdlib.h>
#define Rows 3
#define Cols 4
void sum_rows(int ar[][Cols],int rows); //用指針對二維數組聲明的三種形式
void sum_cols(int [][Cols],int);
int sum2d(int(*ar)[Cols],int rows);
int main(void)
{
int junk[Rows][Cols]={{2,4,6,8},{3,5,7,9},{12,10,8,6}}; //使用宏定義變量
sum_rows(junk,Rows);
sum_cols(junk,Rows);
printf("sum of all elements=%d\n",sum2d(junk,Rows));
system("pause");
return 0;
}
void sum_rows(int ar[][Cols],int rows)
{
int r;
int c;
int tot;
for(r=0;r<rows;r++) //使用兩個for語句,循環使用每一個數組元素
{
tot=0;
for(c=0;c<Cols;c++)
tot+=ar[r][c]; //求“每一行”的總和
printf("row %d:sum=%d\n",r,tot);
}
//無傳回值,使用void類型
}
void sum_cols(int ar[][Cols],int rows)
{
int r,c;
int tot;
for(c=0;c<Cols;c++)
{
tot=0;
for(r=0;r<rows;r++)
tot+=ar[r][c]; //求“每一列”的總和
printf("col %d:sum=%d\n",c,tot);
}
}
int sum2d(int ar[][Cols],int rows)
{
int r;
int c;
int tot=0;
for(r=0;r<rows;r++)
for(c=0;c<Cols;c++)
tot+=ar[r][c]; //求所有元素的總和
return tot; //傳回值為int類型
}
變長數組
在建立數組的時候,使用變量指定數組的長度
例:
#include<stdio.h>
#define Rows 3
#define Cols 4
int sum2d(int rows,int cols,int ar[rows][cols]); //聲明一個以變長數組為形參的函數
//因為ar的聲明要使用rows和cols,是以這兩個變量的聲明要在ar之前
int main(void)
{
int junk[Rows][Cols]={{2,4,6,8},{3,5,7,9},{12,10,8,6}}; //建立實際數組
int morejunk[Rows-1][Cols + 2]={{20,30,40,50,60,70},{5,6,7,8,9,10}}; //建立實際數組
int i,j;
//定義一個變長數組varr
int rs=3,cs=10;
int varr[rs][cs]; //建立實際數組
for(i=0;i<rs;i++)
for(j=0;j<cs;j++)
varr[i][j]=i*j+j;
printf("3x5 array\n");
printf("sum of all elements=%d\n",sum2d(Rows,Cols,junk));
printf("2x6 array\n");
printf("sum of all elements=%d\n",sum2d(Rows-1,Cols+2,morejunk));
printf("3x10 array\n");
printf("sum of all elements=%d\n",sum2d(rs,cs,varr));
return 0;
}
int sum2d(int rows,int cols,int ar[rows][cols]) //ar是個指向數組的指針,實際并未建立數組
{
int r;
int c;
int tot=0;
for(r=0;r<rows;r++)
for(c=0;c<cols;c++)
tot+=ar[r][c];
return tot;
}
注:
1.上面兩個程式展示了指針處理二維數組函數和變長數組的聲明和定義的不同,同時要注意變長數組無論是在函數中聲明還是在函數形參中聲明,都不能使用static和extern類的存儲類型說明符,而且不能再聲明中初始化它們
2.變長數組名實際是個指針,帶變長數組作形參的函數實際也是再原有的數組上處理數組
3.要在聲明變長數組時使用const,該數組的定義必須是在塊中的自動存儲類别數組