c语言 数组名是常量指针

时间:2022-10-19 19:41:50
//数组名是常量指针

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h> //char (*pin)[20]二维数组指针的定义
int getrequerstr(char(*pin)[], int pinlen,const char * pkey, char *pout){
//定义返回key
int ERRO_MSG = ;
//形参非空校验
if (pin == NULL)
{
ERRO_MSG = ;
printf("pin == NULL erro msg key:%d\n", ERRO_MSG);
return ERRO_MSG;
}
if (pinlen == )
{
ERRO_MSG = ;
printf("pinlen == 0 erro msg key:%d\n", ERRO_MSG);
return ERRO_MSG;
}
if (pkey == NULL)
{
ERRO_MSG = ;
printf("pkey == NULL erro msg key:%d\n", ERRO_MSG);
return ERRO_MSG;
}
if (pout == NULL)
{
ERRO_MSG = ;
printf("pout == NULL erro msg key:%d\n", ERRO_MSG);
return ERRO_MSG;
}
char *p = NULL;
//循环遍历字符串数组,判断每个元素中是否有字符串"as",找到一个后,就可以返回
for (int i = ; i < pinlen; i++)
{
//pin本身是一个一维数组的指针,*pin则是获取这个一维数组的第一个元素的指针,
//**pin这是这个一维数组的第一个元素所指向内存空间的值,即这个一维数组的第一个元素的数据
//判断第一个字符串是否存在字符串"as"
//strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。
p = strstr(*pin, pkey);
if (p==NULL)
{
continue;
}
else{
p = p + strlen(pkey);
while (*pout++ = *p++);
break;
}
}
return ERRO_MSG;
} void main(){
int a[] = { };
/*a = a + 1; 错误:error C2106 : “ = ” : 左操作数必须为左值*/
/*a++; 错误:error C2106 : “ = ” : 左操作数必须为左值*/
//以上两个例子说明数组名a是个常量,不可以修改,原因是数组a对应的内存空间在栈区,
//栈区是由系统回收的,如果a的值改变,系统将无法回收数组a所在的内存空间,造成内存泄漏,
//a改变即数组的起始地址发生变化,此时系统就不知道数组a从那里开始,那里结束,因此无法回收 //提高部分 二维数组
char strarr[][] = {"11111as2222","wqerqew","trya1s56y"};
//要求:判断字符串数组里的字符串是否含有字符串"as",如果有截取as后面的所有字符,存入新数组里
//定义新字符串数组
char buf[] = { };
getrequerstr(strarr,,"as" ,buf);
/*strarr++; 错误 :“++”需要左值*/
//证明二维数组名也是常量
//(*strarr)++;// 错误 :“++”需要左值
//*strarr本质上是这个二维数组中‘第一个一维数组的数组名,说明二维数组中的一维数组名也是常量
printf("%s\n",buf);
system("pause");
}