//初始化数组有两种方法 //1 不指定长度 char buf[] = {'a', 'b', 'c'}; //buf是个指针 是个常量指针 //2 指定长度 char buf2[10] = {'a', 'b', 'c'}; //3 字符串和字符数组的区别 char buf3[] = {'a', 'b', 'c', '\0'}; //buf是个指针 是个常量指针 3 |
Memcpy()是内存块拷贝,最后要手动加上’\0’,字符串拷贝strcpy()自动拷贝’\0’ memcpy(pOut, pBegin,n); |
//对于字符串分配内存有三种方式,可以在堆、栈、全局区(常量区),你要知道你的内存是怎么分配的 char *buf1= " abcd11111abcd2222abcdqqqqq "; char buf2[] = " abcd11111abcd2222abcdqqqqq "; //一级指针的输入模型 //没有内存块,哪有指针啊。。。 int trimSpace_很不ok的做法(char *mybuf)//如果人家传buf1无法修改buf1,它分配在全局区是常量无法修改 { int count = 0; int i = 0, j = 0;
char *p = mybuf; j = strlen(p) -1;
while (isspace(p[i]) && p[i] != '\0') { i++; }
while (isspace(p[j]) && j>0) { j--; } count = j-i +1;
// printf("count:%d", count); //void * __cdecl memcpy(void *, const void *, size_t); memcpy(mybuf, mybuf+i, count); mybuf[count] = '\0'; return 0; //system("pause"); }
//一般情况下不要修改输入的内存块的值 int trimSpace_ok(char *mybuf, char *outbuf) { int count = 0; int i = 0, j = 0;
char *p = mybuf; j = strlen(p) -1;
while (isspace(p[i]) && p[i] != '\0') { i++; }
while (isspace(p[j]) && j>0) { j--; } count = j-i +1;
// printf("count:%d", count); //void * __cdecl memcpy(void *, const void *, size_t); memcpy(outbuf, mybuf+i, count); outbuf[count] = '\0'; return 0; //system("pause"); }
|
通过字符串常量初始化字符数组会自动添加\0 而通过字符数组不会 |
char p[4] = "abc"; //strlen(p)为3 char p[8] = "abc\0 abc "; //strlen(p)为3 char p[3] ={'a','b','c'}; //strlen(p)为3 char p[6] ={'a','b','c', '\0','b','c',}; //strlen(p)为3
/*1. 当 char buf[3]={'s','s','d'}时 将\0冲掉 printf("%d\n",strlen(buf)); 不确定多少,因为会一直找\0 printf("%d\n",sizeof(buf)); 等于3 */ /* 2.当: char buf[4]={'s','s','d'}; printf("%d\n",strlen(buf)); 等于3 printf("%d\n",sizeof(buf)); 等于4 */ //如何通过指针获取数组大小 double buf[6]={3.0,3.0,3.0,3.0,3.0}; double*p= buf; //printf("%d\n",strlen(*p)); //一个char型不能求字符串长度 printf("%d\n",sizeof(*p)); //可求数据类型大小 printf("%f\n",strlen(p));//错误值,如果是字符数组,可以求得数组长度 printf("%d\n",sizeof(p));//sizeof总是求得指针本身 printf("%f\n",strlen(buf));//错误值,不能求字符串长度 printf("%d\n",sizeof(buf)); |
注意:语法级别的越界 |
char p[3]=”abcde”; //编译器不报错,运行时错误(并不会崩溃),原因是越界了导致结尾没有了\0,可能等在内存某处找到\0结果错误 printf("%d\n",strlen(p)); //不确定 printf("%d\n",sizeof(p)); //6
|
const int a = 10; int const b = 11;//两者相同 //可看离const修饰符最近的变量/修饰符类型 const char* c = NULL;//const 在*号左边,表示指向的内容不可写 char* const d = NULL;//const 在*号右边,表示指向不可变 const char* const e = NULL; 指针做函数参数时,传入参数一般加上const,防止被改动 |