字符串
一、字符串的定义
字符串其实就是字符数组
定义的格式:
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;
}
熟练掌握以上函数