对形式参数使用const

     在编写处理诸如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。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

### Vue3 中使用 Axios 发送 POST 请求的键值对格式化 在 Vue3 中,当使用 Axios 进行 POST 请求时,如果需要以键值对的形式发送请求参数,可以通过以下方式实现。根据引用内容[^2]和[^3],可以明确 Vue3 的 Axios 封装方式以及 Content-Type 的设置。 #### 1. 设置 Content-Type 为了确保后端能够正确解析请求数据,需要将 Content-Type 设置为 `application/x-www-form-urlencoded`。这可以通过 Axios 的默认配置来完成: ```javascript import axios from 'axios'; // 配置默认 Content-Type axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; ``` #### 2. 使用 URLSearchParams 格式化参数 对于键值对形式的参数,可以使用 JavaScript 原生的 `URLSearchParams` 对象来格式化数据。例如: ```javascript const params = new URLSearchParams(); params.append('key1', 'value1'); params.append('key2', 'value2'); axios.post('/api/endpoint', params) .then(response => { console.log(response.data); }) .catch(error => { console.error(error); }); ``` 这种方式会将参数转换为 `key1=value1&key2=value2` 的形式,适用于大多数后端框架。 #### 3. 使用 qs 库进行序列化 如果需要处理更复杂的对象或数组结构,可以使用 `qs` 库来序列化参数。首先安装 `qs`: ```bash npm install qs ``` 然后在代码中使用 `qs.stringify` 方法: ```javascript import axios from 'axios'; import qs from 'qs'; // 配置默认 Content-Type axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; const data = { key1: 'value1', key2: ['arrayValue1', 'arrayValue2'] }; axios.post('/api/endpoint', qs.stringify(data, { arrayFormat: 'brackets' })) .then(response => { console.log(response.data); }) .catch(error => { console.error(error); }); ``` 这里的 `arrayFormat: 'brackets'` 参数用于指定数组的序列化格式为 `key[]=value1&key[]=value2`,具体格式可以根据后端需求调整。 #### 4. 在 Vue3 中封装 Axios 根据引用内容,Vue3 取消了 `Vue.prototype`,推荐使用 `globalProperties` 来挂载全局方法。可以在插件中封装 Axios 请求: ```javascript import axios from 'axios'; export default { install: (app) => { const $post = (url, data) => { return axios.post(url, new URLSearchParams(data)); }; app.config.globalProperties.$post = $post; } }; ``` 然后在 `main.js` 中引入并使用该插件: ```javascript import { createApp } from 'vue'; import App from './App.vue'; import axiosPlugin from './plugins/axiosPlugin'; const app = createApp(App); app.use(axiosPlugin); app.mount('#app'); ``` 在组件中可以直接调用 `$post` 方法: ```javascript this.$post('/api/endpoint', { key1: 'value1', key2: 'value2' }) .then(response => { console.log(response.data); }) .catch(error => { console.error(error); }); ``` #### 注意事项 - 如果后端接收的格式与前端发送的格式不一致,可能会导致解析失败。建议与后端开发人员确认数据格式。 - 当使用 `qs.stringify` 时,确保正确配置数组的序列化格式,以匹配后端的需求。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值