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

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

学前服用


动画版的这个听完再去看书上的实例真的很不错!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都是对指针进行递增,指向数组下一个元素


相关文章
|
5月前
|
编译器 vr&ar C语言
C primer plus 学习笔记 第10章 数组和指针
C primer plus 学习笔记 第10章 数组和指针
|
6月前
|
存储 C语言
指针数组作为main函数的形参
指针数组作为main函数的形参
34 0
|
6月前
|
存储 C语言
指针数组作为main函数的形参
指针数组作为main函数的形参
59 0
|
6月前
|
安全 编译器 C语言
深入了解C++:形参、内联、重载、引用、const和指针、new和delete
深入了解C++:形参、内联、重载、引用、const和指针、new和delete
40 1
|
6月前
|
存储 Shell C语言
指针数组组main函数的形参
指针数组组main函数的形参
36 0
|
6月前
|
存储 程序员 C语言
18.C语言:指针数组作main函数的形参示例
18.C语言:指针数组作main函数的形参示例
78 0
|
6月前
|
存储
指针数组做main函数的形参
指针数组做main函数的形参
54 0
|
6月前
|
C++
来自C++ Primer 5的函数指针的定义,调用等
来自C++ Primer 5的函数指针的定义,调用等
35 0
|
6月前
|
C语言
C语言中形参列表为指针的三种不同swap函数的通俗理解
C语言中形参列表为指针的三种不同swap函数的通俗理解
53 0
指向结构指针(C Primer Plus 第六版)
指向结构指针(C Primer Plus 第六版)
75 0
下一篇
无影云桌面