指针的深入理解第二篇(指针与字符串)

首先了解一下字符文本和常量

定义字符串时编译器自动在字符串结尾增加转义字符·0。某些文献中字符串常量也叫作字符串文本。
最有趣的事是从RO扇区分配内存给字符串常量。RO扇区是存储字符串文本和常量的只读数据区。
存储在该区域的数据的生命周期为程序运行的整个生命周期,这也是存储在该区域的数据变量的生命期。

#include<stdio.h>
char * fool(void);
int main()
{	
char *m=fool();	
printf("%s\n",m);
}
char *fool(void)
{	char * str="STRING";
	return str;
}

虽然变量的charsr为函数foo0的局部变量,但它在所有范围内均能被访问。
如前所述,变量char
str是一个字符串文本或常量,它的内存是从RO扇区分配的,所以在程序运行的整个生命周期中都有效。
自然常量化为字符串文本的另一个重要特性。**一旦字符串文本被初始化其值,就不能在后面的阶段修改字符串文本,**相当于 const char*变量名,其中指针可被修改,但所指的值不能修改。

下面就写下通过指针实现字符串复制与连接

字符串复制

void str_cpy(char *dest_str,const char *src_str)
{	
char *stemp=src_str;
	char *dtemp=dest_str;	while(*stemp!='\0')	
	{	*dtemp=*stemp;
		dtemp++;	
		stemp++;
	}	
		*dtemp='\0';//字符串末尾记得放结束标识符
}

上面的代码遍历源字符串直到结束符‘0为止。遍历时将每个字符复制到目标字符串,而且同时累加指向源字符串和目标字符串的指针。用一个整数变量来计算该字符串存储的字符数。最后将结束符0复制到目标字符串。

void str_cat(char *dest_str,const char *src_str)
{
	char *stemp=src_str;
	char *dtemp=dest_str;
	while(*dtemp!='\0')
	{
		dtemp++;//到达字符末尾
	}
	while(*stemp!='\0')
	{
		*dtemp=*stemp;
		dtemp++;
		stemp++;
	}
	*dtemp='\0';//字符串末尾记得放结束标识符
}

二级声明

(当数组大小与每个数组元素的数据容量都未知时使用)
声明:
char ** 变量名

下面我们用代码来演示
借助二级字符指针,首先创建指针存储空间,接着从堆中分配空间来存储字符串的指针。
第二次遍历时重新分配内存存储指针,接下来再从堆中分配空间来存储新字符串的指针。

#include<stdio.h>
#include<malloc>
#include<cstring>

int main()
{
	char **arr=NULL;
	char string[30];
	int i;
	for(int i=0;i<6;i++)
	{
		printf("Insert data\n");
		scanf("%s",string);
		if(arr=NULL)
		{
			arr=(char **)malloc(sizeof(char *));
		}
		else 
		{
			arr=(char **)realloc(arr,sizeof(char *)*i+1);
		}
		arr[i]=(char *)malloc(sizeof(char *)*(strlen(string)+1));
		strcpy(arr[i],string);
	}
	for(int i=0;i<6;i++)
	  printf("%d  %s\n",i,arr[i]);
	
	freestrmemory(arr,5);
}
  void freestrmemory(char **arr,int len)
  {
  	int i;
  	for(int i=0;i<=len;i++)
  	{
  		free(arr[i]);
	  }
	  free(arr);
  }

在上述情况下释放内存稍有点棘手。下面
为释放内存所需要遵循的基本步骤。
1.遍历数组每一行。
a.访问每行时,释放存储字符串的相应内存。
2.一旦完成数组遍历,释放存储所有指向字符串指针的分配内存。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落春只在无意间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值