在编写处理诸如int这样基本类型的函数时,可向函数传递int数值,也可传递int型的指针,通常我们直接传递数值;只用在需要在函数中改值时,我们才传递指针。
对于处理数组的函数,只能传递指针,这样可使程序的效率更高。
如果通过值向函数传递数组,则函数中必须分配足够存放一份原数组的拷贝的存储空间,然后把原数组的所用数据复制到这个新数组中。如果简单的把数组的地址传递给函数,然后让函数直接读写原数组,程序的效率会更高.
然而这种技术也会带来一些问题。通常C传递数据的值,其原因是要保证原始数据的完整性。函数使用原始数据的拷贝,这样就不会意外的修改原始数据。但是,由于处理数组的函数直接操作原始数据,所以他能修改原始数据。通常我们在使用数组时做参数时并不希望修改数组的值,如编写一个显示数组所有元素值的函数show_array(double ar[]),然而若在函数中不小心修改了数组的值,可能会违背写这个函数的目的。
ANSI C中提供了一个解决此问题的方法。如果设计意图是函数不改变数组的内容。那么可以在函数原型和定义的形式参数声明中使用关键字const。
下面的例子中有两个函数。
#include<stdio.h>
#define SIZE 5
void show_array(const double ar[],int n);//显示所有元素,使用了const关键字
void mult_array(double ar[],int n,double mult); //修改数组中的元素
int main(int argc,char *argv[])
{
double dip[SIZE] = {20.0,17.66,8.2,4.5,2.3};
printf("the original idp array:\n");
show_array(dip,SIZE);
mult_array(dip,SIZE,2.5);
printf("the dip array after calling mult_array():\n");
show_array(dip,SIZE);
return 0;
}
//显示数组内容
void show_array(const double ar[],int n)
{
int i;
for(i = 0;i < n; i++)
printf("%8.3f",ar[i]);
putchar('\n');
}
//数组中的元素同乘以一个数
void mult_array(double ar[],int n,double mult)
{
int i;
for(i = 0; i < n;i++)
ar[i] *=mult;
}
说明:
void show_array(const double ar[],int n);//原型
//定义
void show_array(const double ar[],int n)
{
int i;
for(i = 0;i < n; i++)
printf("%8.3f",ar[i]);
putchar('\n');
}
这告知编译器:函数应当把ar所指向的数组作为包含常量数组的数组对待。这样,如何在函数中不小心改变了数组元素的值,编译器会报错,通知函数视图修改常量。
总之,如果函数想修改数组的值,那么在函数声明和定义时不使用const,如何不想修改数组的值,则最好在声明数组参数是使用const。
分享到:
相关推荐
5. 函数重载:const可以用于函数重载,通过const限定函数参数的常量性,可以区分不同函数的重载形式。 6. 内存优化:使用const定义的常量只有一份拷贝,不会在内存中产生多个拷贝,这有助于节省内存空间。 7. ...
这种形式通常用于在数组形式的参数中模拟传值调用。函数调用者声称:"我给你一个指向它的指针,但你不能去修改它。"如果函数编写者遵循了这个约定,那么就相当于模拟了值传递。 4. const 用于限定函数的返回值 ...
为提高效率,应改为“引用传递”方式,即使用`void Func(const A& a)`这样的形式,这里的`const`可以防止意外修改参数`a`。 3. **内部数据类型的输入参数**: - 不建议使用“引用传递”并添加`const`,因为这样做...
在C++编程语言中,`const`关键字用于声明常量,它可以用来修饰变量、指针、引用等...在编写代码时,合理地使用`const`不仅可以优化性能(例如,编译器可以对常量进行优化),还能帮助开发者设计更安全、更清晰的接口。
在函数的参数列表中使用`const`关键字,可以限制对参数的修改,这对于函数的调用者来说非常重要。具体有以下几种情况: 1. **修饰输入参数**: - **指针传递**:当参数通过指针传递时,可以在指针前加上`const`...
`const`与指针结合使用时,可以有三种主要形式: - `const int *a;` 表示`a`是一个指向`const` int的指针,也就是说,通过`a`所指向的整型数据是不可以修改的。 - `int * const a;` 表示`a`是一个指向整型数据的...
在函数的参数列表中使用`const`可以指定传入的参数不能在函数内部被修改。例如,在下面的例子中,`FindNum`函数接收一个整型数组`array`作为参数,并且通过使用`const`来确保该数组在函数内部不会被改变: ```cpp ...
const的使用不仅涉及到变量的声明,还包括指针和引用,以及在函数参数和返回值中的应用。 首先,const类型定义的目的是明确指出某个变量或对象的值是不可被更新的。这有助于防止编程过程中的意外修改,增强了程序的...
- **结合使用**:可以同时使用以上两种形式,即指针本身和其所指的内容都声明为常量。 ```cpp const char *const cpc = "Hello World"; // 不能修改内容,也不能重新指向 ``` ##### (3) 修饰函数传入参数 - **...
### 关键字`const`的深入理解与应用 #### 一、引言 ...此外,需要注意的是,虽然`const`可以限制对数据的直接修改,但它并不能阻止所有形式的修改。因此,在实际编程中还需要结合具体场景谨慎使用。
- **作用**:当函数的形式参数为用户自定义类型时,使用`const`可以优化函数调用的性能。 - **示例**: ```cpp // 不使用const void fun1(MyClass a) { // ... } // 使用const void fun2(const MyClass &a) ...
* static 使得变量或对象的存储形式变成静态存储,连接方式变成内部连接,对于局部变量(已经是内部连接了),它仅改变其存储方式;对于全局变量(已经是静态存储了),它仅改变其连接类型。 const 关键字的详细...
接下来,`const`可以与指针结合使用,有两种常见的形式: 1. `const`指针:指针指向的内容是不可变的。 ```c const int *p = &a; // p指向一个常量整型变量 ``` 在这个例子中,`p`是一个指向`int`的指针,但`p`所...
举个例子,如果你只想在画布上绘制图片的一部分,那么可以使用第三种形式,并适当设置sx和sy的值来确定从源图像的哪个位置开始绘制,同时设置sWidth和sHeight来指定绘制的宽度和高度。 示例代码如下: ```...
而动态分配const对象则是这种操作的一个特殊形式,它涉及到在运行时创建不可变的对象。const关键字在C++中用于声明变量或函数参数为常量,表示它们的值在声明后不应被修改。 动态分配const对象的基本语法是: ```...
需要注意的是,`const`不仅应用于变量,还可以应用于函数参数、返回类型,甚至类的成员,体现了C++对常量正确性的全面支持。在实际编程中,应根据需求灵活运用`const`,遵循“尽可能多地使用`const`”的原则,以提高...
总的来说,`const`关键字在C语言中提供了对数据不变性的保护,帮助避免意外修改数据,提高代码的稳定性和安全性。正确使用`const`可以使代码更加清晰,更易于理解和维护。理解并熟练运用`const`的这些用法是C语言...
1. **应用/x-www-form-urlencoded**:这是最常见的情况,参数以键值对形式存在于请求体中。我们可以通过`req.body`获取: ```javascript // 首先,需要安装body-parser中间件 const bodyParser = require('body-...
总的来说,`const`关键字在C语言中提供了对变量的常量约束,提高了代码的安全性和可读性。通过使用`const`,可以更好地捕捉潜在的逻辑错误,并在编译阶段就进行检查,避免运行时出现问题。因此,理解并熟练运用`...