今天小结一下对数组指针的学习:
首先看一下做的练习
练习一:输出数组中的全部元素。(下标法)
解:
main()
{ int a[10],i;
for(i=0;i<10;i++)
a[i]=i;
for(i=0;i<5;i++)
printf("a[%d]=%d\n",i,a[i]);
}
练习二:输出数组中的全部元素。(通过数组名计算元素的地址,找出元素的值)
解:
main()
{ int a[10],i;
for(i=0;i<10;i++)
*(a+i)=i;
for(i=0;i<10;i++)
printf("a[%d]=%d\n",i,*(a+i));
}
练习三:输出数组中的全部元素。(用指针变量指向元素)
解1:
main()
{ int a[10],I,*p;
p=a;
for(i=0;i<10;i++)
*(p+i)=i;
for(i=0;i<10;i++)
printf("a[%d]=%d\n",i,*(p+i));
}
2.
main()
{ int a[10],i,*p=a;
for(i=0;i<10;){
*p=i;
printf("a[%d]=%d\n",i++,*p++);
}
}
需注意的是: 指针变量可以实现本身的值的改变。如p++是合法的;而a++是错误的。因为a是数组名,它是数组的首地址,是常量。
(此程序错误)请修正!
main()
{ int *p,i,a[10];
p=a;
for(i=0;i<10;i++)
*p++=i;
for(i=0;i<10;i++)
printf("a[%d]=%d\n",i,*p++);
}
改正之后:
main()
{ int *p,i,a[10];
p=a;
for(i=0;i<10;i++)
*p++=i;
p=a;
for(i=0;i<10;i++)
printf("a[%d]=%d\n",i,*p++);
}
就对此程序分析一下吧~~
1) 从上例可以看出,虽然定义数组时指定它包含10个元素,但指针变量可以指到数组以后的内存单元,系统并不认为非法。
2) *p++,由于++和*同优先级,结合方向自右而左,等价于*(p++)。
3) *(p++)与*(++p)作用不同。若p的初值为a,则*(p++)等价a[0],*(++p)等价a[1]。
4) (*p)++表示p所指向的元素值加1。
5) 如果p当前指向a数组中的第i个元素,则
*(p--)相当于a[i--];
*(++p)相当于a[++i];
*(--p)相当于a[--i]。
数组名作函数参数
数组名可以作函数的实参和形参。如:
main()
{intarray[10];
……
……
f(array,10);
……
……
}
f(intarr[],int n);
{
……
……
}
array为实参数组名,arr为形参数组名。在学习指针变量之后就更容易理解这个问题了。数组名就是数组的首地址,实参向形参传送数组名实际上就是传送数组的地址,形参得到该地址后也指向同一数组。这就好象同一件物品有两个彼此不同的名称一样。如图: