数组与指针

1、在字符串的指定位置插入一个字符。

#include<stdio.h>
#include<string.h>


int main()
{
int i, length, num;
char ch;
char str[20]={0};
char ptr[20]={0};
scanf("%s%d %c",str, &num, &ch);
length = strlen(str);
/*for(i = 0; i < length-num+1; i++)
{
a[length - i] = a[length - i - 1];

}
a[num - 1] = ch;*/
/*
strncpy(ptr,str, num - 1);
strncpy(ptr + num - 1, &ch, 1);
strcpy(ptr + num, str + num - 1);
*/
strncat(ptr, str, num - 1);
strncat(ptr, &ch, 1);
strcat(ptr, str + num - 1);
printf("%s\n",ptr);
return 0;



}

2、概述函数的调用过程。

1)通过函数名找到函数入口;

2)给形参分配空间(一般存在栈空间,只有被 static 修饰的局部变量会存在数据段中);

3)传值(值传递;地址传递);

4)执行函数体;

5)返回主函数,给出返回值(不要返回局部变量的地址);

6)释放空间(栈空间)。

3、什么是指针?指针有什么特性?

指针其实就是存有地址的变量,就和其他变量一样,他也有着自己的类型,唯一的区别就是,他在定义时需要加一个*号,就比如这样,int *p, 在32位的编译器下,指针都是4个字节。指针身为变量,当然也可以进行正常的加减,但是它与普通变量的运算不同的是,指针的加减所加所减的是指针所指向的类型。

系统为指针分配内存空间;
指针有自己的地址;
指针能够存值,但这些值比较特殊——地址。

4、指针的类型和指针所指向的类型

1)指针的类型:把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型,这是指针本身所具有的类型。

2)指针所指向的类型:把指针声明语句中的指针名字和名字左边的指针声明符“*”去掉,剩下的就是指针所指向的类型。

5、指针的运算

 1.算术运算
    C的指针的算术运算只局限于两种形式。

第一种形式是:    指针+-整数  

标准定义这种形式只能用于指向数组中某个元素的指针,并且这类表达式的结果类型也是指针。这种形式也适用于使用malloc函数动态分配获得的内存。
对一个指针加1使它指向数组中的下一个元素,加5使它向右移动5个元素的位置,依次类推。把一个指针减去3使它向左移动3个元素的位置。

第二种类型的指针运算具有如下的形式:   指针-指针
只有当两个指针都指向同一个数组中的元素时,才允许从一个指针减去另一个指针,两个指针相减的结果的类型是ptrdiff_t,它是一种有符合整数类型。减法运算的值是两个指针在内存中的距离(以数组元素的长度为单位,而不是以字节为单位),因为减法运算的结果将除以数组元素类型的长度。
如果两个指针所指向的不是同一个数组中的元素,那么它们之间相减的结果是未定义的。程序员无从知道两个数组在内存中的相对位置,如果不知道这一点,两个指针之间的距离就毫无意义。

 2.关系运算:   <   <=   >   >=  

不过前提是它们都指向同一个数组中的元素。根据你所使用的操作符,比较表达式将告诉你哪个指针指向数组中更前或更后的元素。标准并未定义如果两个任意的指针进行比较会产生什么结果。

6、常量指针和指针常量

常量指针:即指向一个常量的指针,指向的内容是常量,不可修改,放在常量区的,但指针本身可以修改,即 " *p = 'b' " 是非法的,*p 是 p 指向的常量的第一个字符,是个常量,不能改变的。“ p = &q ”是可以的,指针可以指向不同的地址。

指针常量:即指针本身是个常量,不可修改,但指针指向的内容可以修改,一开始定义时让它指向数组 a,“*p = ‘b’”这是可以的,但“p = &b ”是非法的。

总之,当 const 在 * 之前就是常量指针,而 const 在 * 之后就是指针常量。常量指针指向的内容不可变,但地址可以改变,即指针可以指向别的地址;而指针常量是指针本身不可变,而内容可以修改。

7、空指针的用法

1)用空指针终止对递归数据结构的间接引用;

2)用空指针进行函数调用失败时的返回值;

3)用空指针作警戒值。

8、指针数组与数组指针

指针数组:指针数组可以说成是”指针的数组”,首先这个变量是一个数组,其次,”指针”修饰这个数组,意思是说这个数组的所有元素都是指针类型,在32位系统中,指针占四个字节。
数组指针:数组指针可以说成是”数组的指针”,首先这个变量是一个指针,其次,”数组”修饰这个指针,意思是说这个指针存放着一个数组的首地址,或者说这个指针指向一个数组的首地址。 
根据上面的解释,可以了解到指针数组和数组指针的区别,因为二者根本就是种类型的变量。

9、字符串函数

1、字符串操作 
strncpy(p, p1, n) 复制指定长度字符串 
strncat(p, p1, n) 附加指定长度字符串 
strcasecmp 忽略大小写比较字符串
strncmp(p, p1, n) 比较指定长度字符串 
strchr(p, c) 在字符串中查找指定字符 
strrchr(p, c) 在字符串中反向查找
strpbrk(p, p1) 以目标字符串的所有字符作为集合,在当前字符串查找该集合的任一元素 
strspn(p, p1) 以目标字符串的所有字符作为集合,在当前字符串查找不属于该集合的任一元素的偏移 
strcspn(p, p1) 以目标字符串的所有字符作为集合,在当前字符串查找属于该集合的任一元素的偏移  
2、字符串到数值类型的转换 
strtod(p, ppend)   从字符串 p 中转换 double 类型数值,并将后续的字符串指针存储到 ppend 指向的 char* 类型
存储。
strtol(p, ppend, base) 从字符串 p 中转换 long 类型整型数值,base 显式设置转换的整型进制,设置为 0 以根据特
定格式判断所用进制,0x, 0X 前缀以解释为十六进制格式整型,0x 前缀以解释为八进制格式整型
atoi(p)   字符串转换到 int 整型 
atof(p)   字符串转换到 double 符点数 
atol(p)   字符串转换到 long 整型
3、字符检查 
isalpha() 检查是否为字母字符 
isupper() 检查是否为大写字母字符 
islower() 检查是否为小写字母字符 
isdigit() 检查是否为数字 
isxdigit() 检查是否为十六进制数字表示的有效字符 
isspace() 检查是否为空格类型字符 
iscntrl() 检查是否为控制字符 
ispunct() 检查是否为标点符号 
isalnum() 检查是否为字母和数字 
isprint() 检查是否是可打印字符 
isgraph() 检查是否是图形字符,等效于 isalnum() | ispunct() 
4、函数原型
注意:同样的,所有字符串处理函数都包含在头文件string.h中。

10、函数指针和指针函数

指针函数
指针函数就是返回指针值的函数,本质是一个函数。所以指针函数等价于“返回值为指针的函数”。
定义
指针函数的定义格式如下:函数类型 *函数名([参数列表])
当然,也可以让指针标志*与函数类型紧贴在一起,与函数名分开,其含义一致,格式如下:函数类型* 函数名([参数列表])
相比上一种,这种方式更能表示这是一个指针函数。在将指针函数与函数指针区分时,也可以通过“指针标志*能否和函数名分离”来判断这个一个指针函数,还是一个函数指针。
返回值问题
指针函数的使用和一般函数的使用相同,但需注意返回值问题。对于一个返回值为指针的函数,不能返回auto型局部变量的地址,但可返回static型变量的地址。
这是因为auto型变量的生存周期很短,当函数返回时,auto型变量的内存空间将被释放,如果返回值是auto型变量,那么这个返回指针将无效,变成野指针。而static类型变量占用的内存空间则不会因为函数返回而被释放,不会出现野指针问题。
所以编写指针函数使要注意返回值。总体原则是:返回的指针对应的内存空间不会因函数返回则被释放掉。常用的返回指针有以下几种:
(1)      函数中动态分配内存空间(通过malloc等实现)的首地址;
(2)      静态变量(static)或全局变量所对应的变量的首地址;
(3)      通过指针形参所获得的实参的有效地址。
函数指针
函数指针就是一个指向函数的指针。每个函数在编译时,会被分配一个入口地址,一般用函数名来表示,这个地址就是该函数的指针。
定义
函数指针的定义格式如下:函数类型 (*指针变量) ([参数列表])
在形式上,函数指针的特征是使用一个括号包裹指针标志和指针变量,将括号移除,函数指针就变成指针函数。
之所以容易混淆指针函数和函数指针,是因为指针函数的形式如一般指针变量类型,如:int *x、int *y()、int(*z)()
这里x和z表示一个指针,而y则表示一个函数,所以要注意区分指向变量的指针和指向函数的指针的形式区别。
赋值
函数指针的赋值操作:
使用函数名给指向函数的指针变量赋值。其赋值的一般格式如下:函数指针 = [ &] 函数名;
其中,函数名后不能带括号和参数,函数名前的&是可选,建议不要使用。
调用
函数指针调用格式:函数指针变量([实参列表]); 或 (*函数指针变量)([实参列表]);
推荐第二种用法。这种方法可以很好的表明这是一个函数。而第一种方法则很容易造成误导。
之所以容忍一种调用方法是因为ANSI C 委员会决定容许这种普通函数调用句法。这是因为编译器知道它是一个指向函数的指针,并且它还知道在该环境下所能做的惟一的一件事就是调用函数,因此这里没有任何模糊不清的表达







【电动车优化调度】基于模型预测控制(MPC)的凸优化算法的电动车优化调度(Matlab代码实现)内容概要:本文介绍了基于模型预测控制(MPC)的凸优化算法在电动车优化调度中的应用,并提供了Matlab代码实现。该方法结合了MPC的滚动优化特性凸优化的高效求解能力,用于解决电动车充电调度问题,提升电网运行效率可再生能源消纳能力。文中还提及多个相关研究方向和技术支撑,包括智能优化算法、机器学习、电力系统管理等,展示了其在多领域交叉应用的潜力。配套资源可通过提供的网盘链接获取,涵盖YALMIP工具包及其他完整仿真资源。; 适合人群:具备一定电力系统、优化理论及Matlab编程基础的科研人员和研究生,尤其适合从事电动汽车调度、智能电网优化等相关课题的研究者。; 使用场景及目标:①实现电动车集群在分时电价或电网需求响应机制下的有序充电调度;②结合可再生能源出力负荷预测,利用MPC进行多时段滚动优化,降低电网峰谷差,提高能源利用效率;③为学术论文复现、课题研究及工程仿真提供可靠的技术路线代码支持。; 阅读建议:建议读者结合文档中提到的智能优化算法电力系统背景知识进行系统学习,优先掌握MPC基本原理凸优化建模方法,并下载配套资源调试代码,以加深对电动车调度模型构建求解过程的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值