参考: c primer plus p290
以数组求和为例:
待处理名为marbles 的 int 类型的数组,应该如何调用函数
可能:tolal = sum(marbles); "如果是这么调用的 那么 该函数的原型是什么????"
需要记住的是:数组名 是该数组首元素的地址,所以实际传入的参数marbles是一个存储int 类型值的地址,
应该把它赋给一个指针形式参数,即形参是指向int 的指针;
int sum(int* ar) ;"对应的参数原型函数???"
sum 函数从参数中获取了那些信息,"他获得了该数组的元素的地址",从该位置找出一个整数,
需要注意 传入的参数中,没有携带数组包含多少个元素的信息;
"书本表述:它获得了该数组的元素的地址":可以看出int* a 这样写更符合需要传入的是实际参数指针 a == &marbles[0] !!!!
两种方法让函数获得 传入数组的 元素个数
一个只有一个参数:代码中写上固定大小
int sum(int* ar) {
for(int i ;i<10;i++){
}
}
第二个是:多传一个参数
int sum(int* ar,int n) {
}
"第一个参数 告诉函数该数组的地址和数据类型,第二个是告诉数组中的元素个数"
需要注意的是:只有在函数原型或者函数定义头中才能用:
int sum(int ar [ ],int n) 替换 int sum(int* ar,int n) ;
函数原型的概念:(百度百科)函数原型类似函数定义时的[函数头]又称函数声明。
C语言存在.h文件中先声明(原型函数) 后在.c文件中(函数定义) 调用 实现代码块中的逻辑;
可以理解为只能定义函数的 返回值 函数名 参数 中的"参数"中替换使用;
结论:
int* a 与 int ar[ ] 形式都是表示 ar指向int类型的指针,但是int ar[ ]只能声明形式参数。
int sum(int ar [ ],int n) 格式提醒读者 指针 ar 指向不仅仅是一个int类型值,还是一个int 类型的数组元素;
c primer plus p293
指针是标示数组的开始,可以采用形式参数: 一个指针指向数组的开头 一个指向数组的结尾 ;
"实际 中 调用函数怎么传实际参数???"
将数组名传入 (数组名函数的形式参数中:代表数组的首元素的位置)
指针ar 可以 ar++代表指向下一个元素的位置
*p 中的 p
c primer plus p294
因为++的优先级比 *高 所以*p ++ = 100; *++p = 200;"都没有改变原来数组中各个位置保存的值"
但是:(*p)++ = 300 ;" 将p指针指向的下一个位置的数据改为了300,改变了原来的数组"
网友评论