11.21C语言----数组指针练习

今天小结一下对数组指针的学习:

首先看一下做的练习

练习一:输出数组中的全部元素。(下标法)

解:

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为形参数组名。在学习指针变量之后就更容易理解这个问题了。数组名就是数组的首地址,实参向形参传送数组名实际上就是传送数组的地址,形参得到该地址后也指向同一数组。这就好象同一件物品有两个彼此不同的名称一样。如图:


  不抛弃不放弃!每天进步一点,那就是成功!~~~~~今天学习的还有挺多哦!总之今天不错!继续努力!!!




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值