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