字符串
定义
char buf1[] = "abcdef";
char buf2[] = {'a', 'b', 'c', 0, 'd'}; // 数组值位abc
char buf3[] = {'a', 'b', 'c', '\0', 'd'}; // 数组值位abc
char buf4[100] = {'a', 'b', 'c'}; // 后面97位补0
char buf5[100] = { 0 }; //初始化都是0
//error
char buf[] = {'a', 'b', 'c'}; //不指定数组大小,也没有结束符 '\0', 数字0,则数组会乱码。
strlen: 计算字符串长度,不包含0和\0
sizeof: 计算数组长度,包含0和\0
char buf[] = "1234567890"; 因为默认有\0结尾,sizeof的值是11
char buf[100] = "1234567890"; 因为已经指定长度是100,且后续位数补0, 则sizeof长度是100
操作
char buf[] = "abcdefghi";
char *p = buf; //数组名字 即 数组首元素地址
for(int i=0;i<strlen(buf);i++) {
printf("%c", buf[i]
);
}
for(int i=0;i<strlen(buf);i++) {
printf("%c", *(buf+i)
);
}
for(int i=0;i<strlen(buf);i++) {
printf("%c", p[i]
);
}
for(int i=0;i<strlen(buf);i++) {
printf("%c", *(p+i)
);
}
四者等价,但是buf[] 属于常量,不能修改
字符串拷贝
char src[] = "abcdefg";
char dest[100];
strcpy1(char *src, char *dest) {
//判空
for(int i=0;src[i] != '\0'; i++) {
dest[i] = src[i];
}
dest[i] = 0; //结尾补0,如果初始化时定义char desc[100] = {0}; 结尾就不需要补0
}
strcpy2(char *src, char *dest) {
//判空
for(int i=0;src[i] != '\0'; i++) {
dest[i] = src[i];
}
dest[i] = 0; //结尾补0,如果初始化时定义char desc[100] = {0}; 结尾就不需要补0
}
strcpy3(char *src, char *dest) {
//判空
while(*src != 0) {
*dest = *src;
dest++;
src++;
}
}
strcpy4(char *src, char *dest) {
//判空
while(*src != 0) {
*dest++ = *src++;
}
}
const
const修饰一个变量为只读,定义时需要初始化。(但是可以通过间接指针的方式修改)
const int a = 100;
a = 10; //error
理解点
//从左往右,跳过类型,看修饰的是什么字符
//如果是*,说明指针指向的内存不能变
//如果是变量,说明指针的指向不能变,内存可以变
//双重修饰,则什么都不能变
char buf[] = "abcdefg";
const char *p = buf; //1
char const *p = buf; //2
char * const p = buf; //3
const char * const p = buf; //4
1,2等价且内存不能变,3的指向不能变,4是完全只读
如果是结构体,则内部属性指向类似内存,原则同上
网友评论