学前服用
动画版的这个听完再去看书上的实例真的很不错!www.bilibili.com/video/BV1MJ…
一、使用指针形参
函数要处理数组必须知道何时开始、何时结束。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都是对指针进行递增,指向数组下一个元素