阅读 118

指针如何使用形参?(C Primer Plus第六版)

一、使用指针形参

函数要处理数组必须知道何时开始、何时结束。sum()函数使用一个指针形参标识数组的开始,用一个整数形参表明待处理数组的元素个数(指针形参也表明了数组中的数据类型)。但是这并不是给函数传递必备信息的唯一方法。 还有一种方法是传递两个指针,第1个指针指明数组的开始处(与前面用法相同), 第2个指针指明数组的结束处。同时该程序也表明了指针形参是变量,这意味着可以用索引表明访问数组中的哪一个 元素。

实例

#include <stdio.h> #define SIZE 10 int sump(int * start,int * end); int main(void) {     int marbles[SIZE] = {20,10,5,39,4,16,19,26,31,20};     long answer;     answer = sump(marbles,marbles + SIZE);     printf("The total number of marbles is %ld .\n",answer);     return 0; } /* 使用指针算法 */ int sump(int * start ,int * end) {     int total = 0;     while (start<end)     {         total += *start;    //把数组元素的值加起来         start++;    //让指针指向下一个元素     }     return total;      } 复制代码

输出结果为: The total number of marbles is 190 .

程序解析

指针start开始指向marbles数组的首元素,所以赋值表达式total += start把首元素(20)加给total。然后,表达式start++递增指针变量start,使其指向数组的下一个元素。因为start是指向int的指针,start 递增1相当于其值递增int类型的大小。

注意,sump ()函数用另一种方法结束加法循环。sum()函数把元素的个数作为第2个参数,并把该参数作为循环测试的一部分:

for(i=0;i<n;i++)

而sump()函数则使用第2个指针来结束循环:

while (start < end)

因为while循环的测试条件是-一个不相等的关系,所以循环最后处理的一个元素是end所指向位置的前一个元素。这意味着end指向的位置实际上在数组最后一个元素的后面。C保证在给数组分配空间时,指向数组后面第一个位置的指针仍是有效的指针。这使得while 循环的测试条件是有效的,因为start在循环中最后的值是end。注意,使用这种“越界”指针的函数调用更为简洁:

answer = sump (marbles,marbles + SIZE) ;

因为下标从0开始,所以marbles + SIZE 指向数组末尾的下一个位置。如果end指向数组的最后一个元素而不是数组末尾的下一个位置,则必须使用下面的代码:

answer = sump (marbles,marbles + SIZE - 1);

这种不推荐

还可以把循环体压缩成一行代码

total += *start++;

一元运 算符和+ +的优先级相同,但结合律是从右往左,**所以start++先求值,然后才是start。也就是说,指针start先递增后指向。**使用后缀形式(即start++而不是++start)意味着先把指针指向位置上的值加到total上,然后再递增指针。

**使用++start,顺序则反过来,先递增指针,再使用指针指向位置上的值。如果使用(start)++,则先使用start指向的值,再递增该值,而不是递增指针。**这样,指针将一直指向同一个位置,但是该位置上的值发生了变化。虽然*start++的写法比较常用,但是

*(start++)这样写更清楚。 复制代码

指针的自增

#include <stdio.h> int data[2] = {100,200}; int moredata[2] = {300,400}; int main(void) {     int *p1,*p2,*p3;//定义三个指针     p1 = p2 = data; //指针p1等于指针p2等于数组data首元素     p3 = moredata; //指针p3等于数组moredata首元素     printf("*p1 = %d, *p2 = %d,*p3 = %d\n",*p1,*p2,*p3);//打印三个指针的值     printf("*p1++ = %d, *++p2 = %d, (*p3)++ = %d\n",*p1++,*++p2,(*p3)++);     printf("*p1 = %d , *p2 = %d, *p3 = %d\n",*p1,*p2,*p3);     return 0; } 运算结果为: *p1 = 100, *p2 = 100,*p3 = 300 *p1++ = 100, *++p2 = 200, (*p3)++ = 300 *p1 = 200 , *p2 = 200, *p3 = 301 复制代码

解析

只有(*p3)++ 改变了元素的值

其他两个操作分别把p1和p2指向数组的下一个元素

我的小理解:

和a++,++a意思一样,(a)++先使用a的值,再递增该值,而不是递增指针(相当于变成值++了),a++和++a都是对指针进行递增,指向数组下一个元素


作者:小蜗牛耶
链接:https://juejin.cn/post/7025074745829752840


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐