我们反复强调数组的声明过程其实是内存中分配一段连续的地址。指针是指向地址的一个变量。二者中联系吗?
当然有! 而且联系很紧密。我们可以将一个变量实现一个参数值的传递。比如:
void diplay_value( unsigned int dat)
{
printf("%d",dat);
}
int main( )
{
int m=100;
diplay_value(m);
return 0;
}
一个参数值的传递非常方便,两个参数值的传递也很方便
int add_tow( unsigned int dat1, unsigned int dat2)
{
return dat1+dat2;
}
int main( )
{
int result;
int m1=100;
int m2=200;
result = add_tow(m1,m2);
printf("result =%d\n",result =);
return 0;
}
可以想象实现三个、四个参数值的传递也很方便。但是如果要实现10个或者更多参数传递很麻烦。
在很多资料上会这样介绍“数组名称就是数组第一个元素的地址”。那么我们是否可以使用指正指向
该数组的第一个元素的地址,以实现对该数组的寻址。通过以下代码我们实验一下。
#include
int main( )
{
char *pChar;
char mon[5] = {1,2,3,4,5};
pChar = mon;
printf("%p, %p", pChar, mon);
return 0;
}
在VC中编译输出结果,pChar,与mon有相同的值。
如果我们要遍历mon数组中每个值,就有两种方法。
一种是使用数组下标进行索引,另外通过指针遍历。我们看看两者区别
#include
int main( )
{
char i;
char *pChar;
char mon[5] = {1,2,3,4,5};
pChar = mon;
for(i=0; i<sizeof(mon); i++)<="" p="">
printf("%d ",mon[i]);
printf("\n\n\n\n\n\n");
for(i=0; i<sizeof(mon); i++)<="" p="">
printf("%d ",*(pChar++));
return 0;
}
输出结果:
可以看出使用数组下标索引与使用指针索引实现了相同效果。
我们根据以上代码改写一下。实现输出代码复用
#include
void print_array(int *add, int num)
{
int i;
for(i=0; i<num; i++)<="" p="">
printf("%d ",*(add++));
}
int main( )
{
int mon[5] = {1,2,3,4,5};
print_array(mon, sizeof(mon)/sizeof(int));
}
我们编写了 print_array(int *add, int num)函数,该函数有两个参数add是指针指向传递缓冲区的首地址。num需要在首地址以上处理多少个数据。