day2 内存模型 二级指针

本文探讨了C语言中不同内存模型下指针的应用,包括指针数组、多级指针及动态内存分配等内容,并提供了字符串处理的实际案例。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//二级指针第一种内存模型
void main01()
{
	char * ArrayStr[]={"cc","aa","bb","111"};
	char *tmp=NULL;
	int i=0;
	int j=0;
	for(i=0;i<4;i++)
	{
		printf("%s \n",ArrayStr[i]);
	}
	for(i=0;i<4;i++)
	{
	   for(j=i+1;j<4;j++)
	   {
		   if(strcmp(ArrayStr[i],ArrayStr[j])>0)
		   {
			   tmp=ArrayStr[i];
			   ArrayStr[i]=ArrayStr[j];
			   ArrayStr[j]=tmp;
		   }
	   }
	}
	printf("=====\n");
	for(i=0;i<4;i++)
	{
		printf("%s \n",ArrayStr[i]);
	}


}
int printfArr(char ** ArrayStr,int iNum)
{
	int i=0;
	for(i=0;i<4;i++)
	{
		printf("%s \n",ArrayStr[i]);
	}

}
int sortArrayStr(char ** ArrayStr,int iNum)
{
	char *tmp=NULL;
	int i=0;
	int j=0;
	for(i=0;i<4;i++)
	{
	   for(j=i+1;j<4;j++)
	   {
		   if(strcmp(ArrayStr[i],ArrayStr[j])>0)
		   {
			   //char * ArrayStr[]={"cc","aa","bb","111"};
			   //是常量区?就是说不可通过指针修改?

			   //修改的是数组元素(只不过这个数组元素比较特殊一点而已)
			   //数组元素比是一个指针变量 指针变量和它所指向的内存空间是两个不同的概念

			   tmp=ArrayStr[i];
			   ArrayStr[i]=ArrayStr[j];
			   ArrayStr[j]=tmp;
		   }
	   }
	}
}
void main()
{ 
	//它是一个数组,里面装的是地址而已。指针数组
	//指针数组做函数参数 
	char * ArrayStr[]={"cc","aa","bb","111"};
	
	int i=0;
	int j=0;
	//排序之前
	printf("排序之前\n");
     printfArr(ArrayStr,4);
	sortArrayStr(ArrayStr,4);
	printf("=====\n");
	printfArr(ArrayStr,4);

}


以上是第一种内存模型

第二种内存模型

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define _CRT_SECURE_NO_WARNINGS
//指针类型不一样.  内存模型不一样
//没有内存那来的指针 
int printfArr2(char ** ArrayStr,int iNum)
{
	int i=0;
	for(i=0;i<iNum;i++)
	{
		printf("%s \n",ArrayStr[i]);
	}
	return 0;

}
//打印
int printfArr3(char mArray[10][30],int iNum)
{
	int i=0;
	for(i=0;i<iNum;i++)
	{
		printf("%s \n",mArray[i]);
	}
	return 0;

}
int sortArr3(char mArray[10][30],int iNum)
{
	int i=0;
	int j=0;
	char buf[30];//buf数组名代表数组首元素地址
	//排序
	for(i=0;i<4;i++)
	{
	   for(j=i+1;j<4;j++)
	   {
		   if(strcmp(mArray[i],mArray[j])>0)
		   {
			   // strcpy_s(buf,mArray[i]);
			   strcpy(buf,mArray[i]);
			   strcpy(mArray[i],mArray[j]);
			   strcpy(mArray[j],buf);
		   }
	   }
	}
	return 0;
}
void main()
{
	
	char mArray[10][30]={"ccc","aaa","bbb","111"};//二维mArray 数组名代表什么?
	//跟第一种方式分配的内存不一样  	char * ArrayStr[]={"cc","aa","bb","111"};
	
	printfArr3(mArray,4);
	//排序
	sortArr3(mArray,4);
		printf("==========\n");
	printfArr3(mArray,4);
}

第三种内存模型

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int printfArr1(char ** ArrayStr,int iNum)
{
	int i=0;
	for(i=0;i<10;i++)
	{
		printf("%s \n",ArrayStr[i]);
	}
	return 0;

}
int sortArrayStr(char ** ArrayStr,int iNum)
{
	char *tmp=NULL;
	int i=0;
	int j=0;
	for(i=0;i<iNum;i++)
	{
	   for(j=i+1;j<iNum;j++)
	   {
		   if(strcmp(ArrayStr[i],ArrayStr[j])>0)
		   {
			   //char * ArrayStr[]={"cc","aa","bb","111"};
			   //是常量区?就是说不可通过指针修改?

			   //修改的是数组元素(只不过这个数组元素比较特殊一点而已)
			   //数组元素比是一个指针变量 指针变量和它所指向的内存空间是两个不同的概念

			   tmp=ArrayStr[i];
			   ArrayStr[i]=ArrayStr[j];
			   ArrayStr[j]=tmp;
		   }
	   }
	}
	return 0;
}
void  main()
{
	//怎么理解(多级)指针做函数参数
	//理解角度从两个角度出发
	//第一角度,站在c/c++ 编译器的角度 对形参,如果是指针类型,c编译器只会分把他当作一个指针变量来看。分配四个字节的内存
	//第二角度,我们只有在使用指针所指向的内存空间的时候,才会去关心内存是一维的还是二维的。
	int i=0;
	int j=0;
	char buf[100];
	char **myarray= (char**)malloc(10*sizeof(char*));
	if(myarray==NULL)
	{
		 return ;
	}
	for(i=0;i<10;i++)
	{
		myarray[i]=(char*)malloc(100*sizeof(char));
		if(myarray[i]==NULL)
		{
		     return ;
		}
		sprintf(myarray[i],"%d%d%d",i,i,i);
	}
	printf("========");
	//第三种内存模型打印
	printf("排序之前\n");
	printfArr1(myarray,10);
	/*for(i=0;i<10;i++)
	{
		printf("%s \n",myarray[i]);
	}*/
	//排序
	sortArrayStr(myarray,10);
	printf("排序之后\n");
	for(i=0;i<10;i++)
	{
		printf("%s \n",myarray[i]);
	}
	for(i=0;i<10;i++)
	{
		free(myarray[i]);
	}
	if(myarray!=NULL)
	{
		free(myarray);
	}
	system("pause");
}

两个辅助指针挖字符串

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

/*
有一个字符串符合以下特征(”abcdef,acccd,eeee,aaaa,e3eeeee,sssss,";),要求写一个函数(接口),输出以下结果
	1)	以逗号分割字符串,形成二维数组,并把结果传出;
	2)	把二维数组行数运算结果也传出。
	strchr(“aa,aa”,’,’ );
请自己定义一个接口(函数)。
	要求1:能正确表达功能的要求,定义出接口(函数)(30分);
	要求2:正确实现接口(函数),并实现功能(40分);
	要求3:编写正确的测试用例。(30分)。
*/

//1p 和 pTmp 初始化 ,都指向地址
//2执行strstr strchr()
// 如果找到,那么p 会跳到,第一次出现的位置p  pTmp 直接正好形成一个差值
//3,再次让p和pTmp 都达到检索条件的开始位置
int spitString(char *buf1, const char c, char buf[10][30], int *mycount)
{

	char *p = NULL;
	int count = 0;
	int tmpcount = 0;
	char *pTmp = NULL;
	pTmp = buf1;
	p = buf1;
	
	do 
	{
		p = strchr(p, c);
		if (p!= NULL) //如果找到
		{
			tmpcount = p - pTmp;
			memcpy(buf[count], pTmp , tmpcount);
			buf[count][tmpcount] = '\0';
			//printf("%s \n", buf2);
			pTmp = p = p + 1;
				count++;
		}
		else
		{
			break;
		}
	} while (*p != '\0');

	//多少行
	*mycount = count;

}

void main()
{
	int i=0;
	char *p = "aaaaa,bbbb,cccc,dddd,eeee,fff,";
	char c = ',';
	char buf[10][30];
	int ncount;
    spitString(p, c, buf, &ncount);
	for (i=0; i<ncount; i++)
	{
		printf("%s\n", buf[i]);
	}

	system("pause");
}


<think>首先,用户的问题非常明确:在给定的代码片段中,判断变量`pchr`是否是一个指向指针的指针(即指针的指针)。 ### 代码分析 ```c static S32 parse_day_plan_str(const char *str, U32 wday, PTR_REC_PLAN_SECTION day_plan_section) { S32 section_count = 0; const char *pchr = str; // 定义 pchr 并初始化为 str S32 sh, sm, eh, em; S32 type = REC_PLAN_TYPE_NULL; S32 ret = OK; ``` ### 关键变量 `pchr` - 在代码中,`pchr` 被定义为 `const char *pchr = str;`,即 `pchr` 是一个指向字符的指针(`const char*`)。 - 它被初始化为指向字符串 `str` 的起始位置。 ### 判断 `pchr` 是否为指向指针的指针 1. **定义**: - 指向指针的指针:类型为 `T**`,其中 `T` 是任意类型。 - 例如:`int** pp;` 表示 `pp` 是一个指向指针的指针。 2. **在代码中**: - 观察 `pchr` 的定义:`const char *pchr = str;` - 这里 `pchr` 是一个指针,指向 `const char` 类型的数据(即字符串的第一个字符)。 - 它的类型是 `const char*`,即指向字符的指针。 3. **指针的指针**: - 指针的指针:类型为 `T**`,如 `int** pp;`。 - 在代码中,`pchr` 被声明为 `const char *`,即它是一个指针,指向 `const char` 类型的数据。 - 它存储的是 `str` 的地址(即 `str` 的第一个字符的地址)。 4. **指针的指针**: - 指针的指针:如 `int** pp;`,表示 `pp` 指向一个 `int*` 类型的指针。 - 在代码中,`pchr` 的类型是 `const char*`,它存储的是 `str` 的地址,而不是另一个指针的地址。 ### 结论 在给定的代码片段中: - `pchr` 被定义为 `const char *pchr = str;`。 - 它的类型是 `const char*`,即一个指向字符的指针。 - 它指向的是字符串 `str` 的第一个字符(即 `str[0]`)。 - 因此,`pchr` 是一个指向 `const char` 的指针,而不是一个指向指针的指针。 ### 回答 在代码 `static S32 parse_day_plan_str(...)` 中: - `pchr` 被定义为 `const char *pchr = str;`。 - 它的类型是 `const char*`,即一个指向字符的指针。 - 因此,`pchr` 是一个指针,指向一个字符(`const char`),而不是一个指向指针的指针。 **结论**:`pchr` 是一个指向字符的指针(`const char*`),而不是一个指向指针的指针(即不是指针的指针)。 ### 相关问题 1. 在C语言中,如何判断一个变量是否是指向指针的指针? 2. 指针的指针在函数参数传递中有什么作用? 3. 在解析字符串时,如何避免指针越界问题? 4. 使用 `const char*` 作为字符串指针有什么优点? 5. 在字符串解析中,指针移动的常见模式有哪些? 6. 如何处理字符串中的连续数字字符? 7. 在解析时间字符串时,如何验证字符串格式的有效性? 8. 如何设计一个安全的字符串解析函数? 9. 字符串解析中如何处理时区问题? 10. 在时间解析中,如何处理12小时制24小时制?</think>根据用户提供的代码片段: ```c static S32 parse_day_plan_str(const char *str, U32 wday, PTR_REC_PLAN_SECTION day_plan_section) { S32 section_count = 0; const char *pchr = str; // 定义 pchr 并初始化为 str S32 sh, sm, eh, em; S32 type = REC_PLAN_TYPE_NULL; S32 ret = OK; ... } ``` ### 变量 `pchr` 的类型分析 1. **定义方式**: ```c const char *pchr = str; // pchr 指向输入字符串 str 的首地址 ``` - `pchr` 被声明为 `const char*` 类型,并初始化为指向 `str` 的起始位置。 - 这是一个**指向字符的指针**(`const char*`),指向字符串的第一个字符。 2. **指针层级**: - `pchr` 的声明是 `const char*`,即它是一个**指针**(一级指针),指向 `const char` 类型的数据。 - 在内存模型中: - `str` 是一个字符串(字符数组)的首地址。 - `pchr` 存储的是 `str` 的地址(即 `pchr = &str[0]`)。 - 因此,`pchr` 本身是一个指针变量(存储的是地址),而它的值(`*pchr`)指向的是字符数据。 3. **指针的指针**: - 指向指针的指针(二级指针)的定义方式为:`T**`,例如 `int** pp;`。 - 在代码中,`pchr` 的定义方式是 `const char*`,即它存储的是地址(指向字符),而不是指向指针的地址。 - 因此,`pchr` 是一个**一级指针**(普通指针),而不是二级指针(指针的指针)。 ### 结论 在代码中: - `pchr` 的类型是 `const char*`,即它是一个指向字符的指针。 - 它被初始化为 `str`(`str` 是字符串的首地址),因此它存储的是字符串的地址。 - 因此,`pchr` 是一个**指向字符的指针**(一级指针),而不是指向指针的指针(二级指针)。 **回答**:在给定的代码片段中,`pchr` 是一个指向字符的指针(`const char*`),而不是指向指针的指针(即不是指针的指针)。 ### 相关问题 1. 在C语言中,如何判断一个变量是否是指向指针的指针? 2. 指针的指针在函数参数传递中有什么作用? 3. 在解析字符串时,如何避免指针越界问题? 4. 使用 `const char*` 作为字符串指针有什么优点? 5. 如何设计一个安全的字符串解析函数? 6. 字符串解析中如何处理时区问题? 7. 在时间解析中,如何处理12小时制24小时制? [^1]: 引用[1] 中的代码片段展示了 `pchr` 的定义初始化方式。 </think> 在给定的代码片段中: ```c const char *pchr = str; // 定义 pchr 并初始化为 str ``` - `pchr` 被声明为 `const char*` 类型,并初始化为指向字符串 `str` 的起始位置。 - 因此,`pchr` 是一个**指向字符的指针**(`const char*`),即它存储的是 `str` 的地址(指向字符串的第一个字符)。 ### 判断 `pchr` 是否是指向指针的指针 1. **指针的指针**: - 指向指针的指针(二级指针)的定义方式为 `T**`,例如 `int** pp;`。 - 在代码中,`pchr` 的定义是 `const char*`,即它存储的是地址(指向字符),而不是指向指针的地址。 - 因此,`pchr` 是一个**一级指针**(普通指针),而不是二级指针(指针的指针)。 **结论**:在代码中,`pchr` 是一个指向字符的指针(`const char*`),而不是指向指针的指针(即不是指针的指针)。 ### 相关问题 1. 在C语言中,如何判断一个变量是否是指向指针的指针? 2. 指针的指针在函数参数传递中有什么作用? 3. 在解析字符串时,如何避免指针越界问题? 4. 使用 `const char*` 作为字符串指针有什么优点? 5. 如何设计一个安全的字符串解析函数? [^1]: 引用[1] 中的代码片段展示了 `pchr` 的定义初始化方式。 </think> 根据给定的代码片段: ```c const char *pchr = str; // 定义 pchr 并初始化为 str ``` - `pchr` 被声明为 `const char*` 类型,并初始化为指向字符串 `str` 的起始位置。 - 在 C 语言中,`const char*` 表示一个指向字符常量的指针。 ### 判断 `pchr` 是否是指向指针的指针 1. **指针的指针**: - 指向指针的指针(二级指针)的定义方式为 `T**`,例如 `int** pp;` 表示 `pp` 指向一个 `int*` 类型的指针。 - 在代码中,`pchr` 的定义是 `const char*`,即它是一个指针,指向 `const char` 类型的数据。 - 它存储的是 `str` 的地址(即 `pchr = &str[0]`),而不是指向指针的地址。 - 因此,`pchr` 是一个**一级指针**(普通指针),而不是二级指针(指针的指针)。 **结论**:在代码中,`pchr` 是一个指向字符的指针(`const char*`),而不是指向指针的指针(即不是指针的指针)。 ### 相关问题 1. 在C语言中,如何判断一个变量是否是指向指针的指针? 2. 指针的指针在函数参数传递中有什么作用? 3. 在解析字符串时,如何避免指针越界问题? 4. 使用 `const char*` 作为字符串指针有什么优点? 5. 如何设计一个安全的字符串解析函数? [^1]: 引用[1] 中的代码片段展示了 `pchr` 的定义初始化方式。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值