1.字符串可以理解成字符数组,定义字符串几种格式:
(1)和整型一样:int data[ ] = {1,2,3,4,5};
(2)和字符型数组一个道理:char str[ ] = {'h','e','l','l','0'};
(3)改进:char str[ ] = "hello";
(4)一般用char *p =“hello”.
#include <stdio.h>
int main()
{
int data[] = {1,2,3,4,5};
char cdata[] = {'h','e','l','l','o',};
char cdata2[] = "hello";//字符串变量,可以被修改
char *pchar = "hello";//字符串常量,不允许被修改
//char *p;//野指针,并没有明确的内存指向,危险
cdata2[3] = 'm';
printf("%s\n",cdata2);
puts(cdata2);
return 0;
}
2.和整型数组在存储上的区别 :多了结束标志‘\0’
#include <stdio.h>
int main()
{
//字符串和字符数组的区别:
int data[] = {1,2,3,4,5};
char cdata[5] = {'h','e','l','l','o'};
char cdata2[] = "hello";//字符串的结束标志是‘\0’
int len = sizeof(data)/sizeof(data[0]);
printf("data:len=%d\n",len);
len = sizeof(cdata2)/sizeof(cdata2[0]);
printf("cdata2:len=%d\n",len);
len = sizeof(cdata)/sizeof(cdata[0]);
printf("cdata:len=%d\n",len);
return 0;
}
3.sizeof和strlen的区别
#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));//字符串有效长度
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:p :%d\n",strlen(p));
return 0;
}
4.动态开辟字符串
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *p;//野指针
p = (char *)malloc(1);//p有了具体的内存指向
*p = 'c';
free(p);//释放悬挂指针(野指针的一种),防止内存泄露
p = NULL;
p = (char *)malloc(12);//重新开辟12个字节
if(p == NULL){
printf("malloc error\n");
exit(-1);
}
memset(p,'\0',12);//清理内存空间
printf("扩容地址:%x\n",p);
int len = strlen("yingjie1234567");
int newLen = len - 12 + 1;//+1的目的是用来存放'\0'
realloc(p,newLen);//扩容函数
printf("扩容地址:%x\n",p);//扩容后地址不变
strcpy(p,"yingjie1234567");
puts(p);
puts("end");
return 0;
}