C51学习心得体会,指针和数组在程序设计中的关系
扫描二维码
随时随地手机看文章
C语言中的指针和数组几乎可以互换,数组名可认为是一个常量指针,指针可用来完成涉及数组下标的操作。
e.g.int * nPtr;
int Array[size];
(1)数组与指针等价
nPtr = Array;或者nPtr = &Array[0];
(2)引用数组元素Array[3]
nPtr[3]或者*(nPtr+3)或者*(Array+3)
其中,nPtr[3]为指针下标表示法。
(3)e.g.数组拷贝
//用数组表示法把s2拷贝到s1中
void copy1(char *s1,constchar *s2)
{
int i
for(i=0;s1[i]=s2[i];i++);
}
//用指针表示法把s2拷贝到s1中
void copy1(char *s1,constchar *s2)
{
for(;* s1=* s2;s1++,s2++);
}
(4)指针数组
char * suit[4]={"zhonghua","renmin","gonghe","guojia"};
//char * 表示suit数组的每一个元素都是指向char类型的指针,即suit数组中存储的是4个指针。
//等价于 char suit[4][9]={"zhonghua","renmin","gonghe","guojia"};
//二维数组必须设置相同的列数,因此指针数组更具有灵活性。
(5)数组指针
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[4];
p=a;
*(*(p+i)+j);//表示a[i][j]的值
void search(float (*p)[4],int n);//多维数组的指针作为函数参数
search(a,2);//函数调用
(6)指向指针的指针
e.g. main()
{
char *name[]={"Beijing","Chongqing","Shanghai","Tianjin","Shijiazhuang"};
char **p;
int i;
for(i=0;i<5;i++)
{ p=name+i;
printf("%sn",*p);//如果是**p,表示一个字符。
}
}
举例:洗牌和发牌程序
#include
#include
#include
void shuffle(int [][13]);//为什么参数中数组的第二个下标必须有
void deal(const int [][13],const char * [],const char * []);
main()
{
int deck[4][13]={0};
constchar * face[4]={"Hearts","Diamonds","Clubs","Spades"};//指针数组
constchar * suit[13]={"one","two","three","four","five","six","seven",
"eight","nine","ten","eleven","twelve","theteen"};
srand(time(NULL));
shuffle(deck);
deal(deck,face,suit);* face[4]和* suit[13]数组必须定义成const,否则在此出现错误,
//错误类型:不能把“* char[]”转换成“const * char[]”
return 0;
}
void shuffle(int wDeck[][13])
{
int row,col,i;
for(i=1;i<53;i++)
{
row=rand()%4;
col=rand()%13;
while(wDeck[row][col]!=0)
{
row=rand()%4;
col=rand()%13;
}
wDeck[row][col]=i;
}
}
void deal(const int wDeck[][13],const char * wFace[],const char * wSuit[])
{
int i,row,col;
for(i=1;i<53;i++)
for(row=0;row<4;row++)
for(col=0;col<13;col++)
{
if(wDeck[row][col]==i)
printf("%5s of %-8s%c",wFace[row],wSuit[col],i%2==0?'n':'t');
}
}