C語言程式設計-指標遍歷二維陣列
阿新 • • 發佈:2019-01-07
筆記:
一:操作方法
①a[1][2]地址為:a[1]+2,*(a+1)+2 ((a+1)第二行地址,*(a+1)+2第二行第一列地址),&a[1][2]
②a[1][2]值為:*(a[1]+2),*(*(a+1)+2),a[1][2]
③*(行地址)→列地址;*(列地址)→某行某列的值
二:指標與二維陣列概要
①二維陣列有行地址(行指標)和列地址(列指標)。
②二維陣列的名字為第一行地址,二維陣列名字加上n為n+1行地址。
③二維陣列的每一行地址和每一行第一列地址本身的值一樣,但概念不同。
④通過行地址(行指標)和列地址(列指標)均可遍歷二維陣列
⑤指標運算子(*)加上行地址可獲得列地址;(&)加上第一列地址可以獲得當前行地址;指標運算子(*)加上列地址可獲得列地址中的元素值。
#include <stdio.h>
void out1(int a[][4],int size);
void out2(int *p,int size);
void out3(int (*p)[4],int row,int col);//行數不用標明,列數必須標明
int main(void)
{
int a[][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
out1(a,12);//陣列a首地址
printf("\n************************\n");
out2(*a,12);
printf("\n************************\n" );
int (*p)[4];
p=a;
out3(a,3,4);
printf("************************\n");
out3(p,3,4);
printf("************************\n");
return 0;
}
//列指標遍歷1
void out1(int a[][4],int size)
{
int *p; //p為指向某行某列元素的指標
/*p為陣列第一行第一列元素的地址*/
for(p=a[0];p<a[0]+size;p++)
{
if ((p-a[0])%4==0)//每遍歷4個元素換行
printf("\n");
printf("%5d",*p);//*地址為該地址裡的值
}
}
//列指標遍歷2
void out2(int *p,int size)
{
int *s;//另定義一個指標s
for(s=p;s<p+size;s++)
{
if((s-p)%4==0)
printf("\n");
printf("%5d",*s);
}
}
//行指標遍歷
/*p為陣列指標(行指標) 指向的是行*/
/*第一個形參為一維陣列*/
void out3(int (*p)[4],int row,int col)
{
int i,j;
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
printf("%5d",*(*(p+i)+j));
/*
p是第1列地址,p+i就是第i行的地址
*(p+i)就是第i行第一列的地址
*(p+i)+j就是第i行第i列的地址
*(*(p+i)+j)就是第i行第j列地址裡的內容
*/
}
printf("\n");
}
}