第六章(字符串上)

本文介绍了C语言中字符串和字符数组的定义、操作以及内存管理。讨论了字符串常量与字符串变量的区别,指针的使用注意事项,包括野指针的风险。同时,文章通过示例代码展示了如何计算数组元素个数,`sizeof`与`strlen`的区别,并演示了动态开辟和调整字符串内存的方法,如`malloc`、`free`和`realloc`的使用。
摘要由CSDN通过智能技术生成

字符串

一、字符串的定义

字符串其实就是字符数组

定义的格式:

1、char data[] = "hello";

2、常用 char *p = “hello”;

区别:1是字符串变量,2是字符串常量不允许修改

注意指针的操作:保存地址可以 ——修改指向——指向字符串常量的地址空间

对野指针的内存空间操作不行

#include <stdio.h>

int main()
{
	int data[] = { 1,2,3,4,5 };
	char cdata[] = { 'a','d','d','r' };
	char cdata2[] = "addr"; 
	char* pchar = "hello"; //字符串常量,不允许被修改
	char c = 'c';

	//char* p;//野指针,并没有明确的内存指向,危险(会影响其他程序的内存空间)
	
	cdata2[3] = 'm';
	printf("%s", cdata2);
	putchar('\n');
	puts(cdata2);
	*pchar = 'm';
	puts("end");

	/*
	int i;
	for(i=0; )*/

	return 0;
}

二、字符数组和整型数组在存储上的区别(字符数组的存储方式多了结束标志'\0')

计算数组大小及数组元素的个数(面试)

#include <stdio.h>
#include <string.h> //字符相关的

//strcpy strcmp strcat strstr

int main()
{
	//字符串和字符数组的区别;
	int data[] = {1,2,3,4,5,6};
	//请计算数组data的元素个数(面试)
	char cdata[6] = {'h','e','l','l','o'}; //字符串的结束标志'\0',因此字符数组比字符串多一个元素
	char cdata2[] = "hello";

	int len = sizeof(data)/sizeof(data[0]); //计算数组data的元素个数
	printf("len = %d\n",len);

	 len = sizeof(cdata2)/sizeof(cdata2[0]);
	printf("len = %d\n",len);

	 len = sizeof(cdata)/sizeof(cdata[0]);
	printf("len = %d\n",len);

	printf("%s\n",cdata);
	return 0;
}

三、重点:sizeof和strlen的区别(注意:要使用strlen函数,要写入头文件#include <string.h>)

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

void test()
{

}


int main()
{
	char cdata[128] = "hello"; //'\0'
	void (*ptest)();
	ptest = test;
	printf("sizeof :%d\n",sizeof(cdata)); //计算数组元素个数 
	printf("strlen :%d\n",strlen(cdata)); //同上,,(有效字符长度)会自动略过'\0',因此会比用sizeof少一个元素


	char *p = "hello";
	//p是一个char *,sizeof来计算的时候,得出是计算机用多少字节来表示一个地址
	printf("sizeof:p    %d\n",sizeof(p));
	printf("sizeof:char*    %d\n",sizeof(char*));
	printf("sizeof:int *    %d\n",sizeof(int *));
	printf("sizeof:char     %d\n",sizeof(char));
	printf("sizeof:ptest    %d\n",sizeof(ptest));
	printf("strlen          %d\n",strlen(p));

	return 0;
}

四、动态开辟字符串

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

int main()
{
	char *p; //野指针
	// malloc分配所需的内存空间,并返回一个指向它的指针
	//malloc 函数原型 void *malloc(size_t size),
	p = (char *)malloc(1); //p有了具体的内存指向

	*p = 'c';
	// free 函数原型 void free(void *ptr) 释放之前调用 calloc、malloc 或 realloc 所分配的内存空间。
	free(p); //作用:1、释放,防止内存泄漏   2、防止悬挂指针,(悬挂指针是野指针的一种)
	p = NULL; 
	p = (char *)malloc(12);
	if(p == NULL){
		printf("malloc error\n");
		exit(-1);
	}

	memset(p,'\0',12);  //函数原型 void *memset(void *str, int c, size_t n)
	printf("扩容地址: %x\n",p);
	int len = strlen("xiaoluo12345678986634353");
	int newlen = len - 12 + 1;
	// realloc函数原型 void *realloc(void *ptr, size_t size)
	realloc(p,newlen); //(扩容)尝试重新调整之前调用 malloc 或 calloc 所分配的 ptr 所指向的内存块的大小。
	printf("扩容后地址:%x\n",p);

	//字符串常用的API之一 strcpy 
	//char *strcpy(char* dest, const char *src);
	strcpy(p,"xiaoluo12345678986634353");
	puts(p);
	puts("end");

	return 0;
}

 熟练掌握以上函数

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值