———–Java培训、Android培训、IOS培训、.Net培训、期待与您交流!————
本节是个人学习过程中的笔记,供初学者一起学习,欢迎大家批评指正,留言参与讨论,谢谢。
前面有两节已经写到字符串了,今天做一个补充总结(定义、赋值、sizeof、strlen)。
- 字符串可以由两种方式来定义,字符数组和字符指针。
- 定义的同时可以由两种方式来赋值,一个是{‘a’,’b’,…}字符数组元素的形式,另外一种是字符串形式”ab…”。
- 数组定义的字符串,除了数组名是一个类似指针的常量不可改变外,其他元素都可以单独访问改变。
- 指针定义的字符串,只能通过字符串形式”ab…”来赋值。而且字符串为常量,定义字符串的那个指针是可以指向其他地方的。
- 用字符串形式”ab…”来赋值实现的字符串,无论是什么定义方式,也不论”“中是否已经存在’\0’,系统都会在字符串末尾加上一个’\0’。
- sizeof()函数,在碰到指针变量时都会返回8即指针大小(64位编译器),其他情况则计算该字符串所占内存字节数(把字符串里面自带的’\0’或者系统添加的’\0’,都计算在内)。
- strlen()函数,原理就是不断匹配,不管是字符串内部自带的’\0’或者系统末尾添加的’\0’,只要碰到第一个’\0’,函数就会返回,正常情况下都返回字符串有效元素个数(不包括’\0’)。
详细变化请参考代码,谢谢。
#include <stdio.h>
#include <string.h>
int main()
{
char name[]="Jack";
char n1[]="test0 okla";
char* name1="Jack";
char* n2="test0 okla";
printf("sizeof(name)=%zd\n",sizeof(name)); //输出5,表示所占用内存大小,系统添加的'\0'也会被计算入内
printf("sizeof(name1)=%zd\n",sizeof(name1));//输出8,输出的是指针类型的大小
printf("sizeof(n1)=%zd\n",sizeof(n1));
printf("sizeof(n2)=%zd\n",sizeof(n2));
//此处计算指针字符数组n2所占内存空间,是sizeof()不能求出来的部分。两种方法实现如下
//方法1,自己去遍历求出大小,包含最后默认添加的'\0'
int possess = 1;
while(*(n2+possess-1))
{
//n2++;
possess++;
}
printf("possess of n2=%d\n",possess);
//方法2,利用strlen函数,其实这个函数也就干咯上面代码的事情。其中+1就是计算'\0'入内
printf("strlen(n2)+1=%d\n",strlen(n2)+1);
printf("%s\n",n2);
printf("strlen(n1)=%zd\n",strlen(n1));
printf("strlen(n2)=%zd\n",strlen(n2));
for (int j=0; j<6; j++) {
printf("name1[%d]=%c\n",j,*(name1+j));
}
if (*(name1+4)==0) {
printf("name1[4]==0\n");
}
if (*(name1+4)=='\0') {
printf("name1[4]为'\\0'\n");
}
// if (*(name1+4)==NULL) {
// printf("name1[4]为''\n");
// }
if (0 =='\0') {
printf("0 =='\\0'\n");
}
if (0 =='0') {
printf("0 =='0'\n");
}
void anotherTest();
anotherTest();
}
void anotherTest()
{
//瞧瞧下面字符串,末尾是啥?系统是否自动添加'\0'
char m[]="Jack";
char* m1="Jack";
char* m2="Jack";
char* m3="Jack\0";
char m4[]="Jack\0"; //结果显示,不管左边如何,只要右边是字符串形式,即使最后有'\0',系统还是会当做正常字符处理,在其末尾加上'\0'
char m5[]={'J','a','c','k'};
char m6[]={'J','a','c','k','\0'};
char m7[]={'J','a','\0','k','\0'};
char m8[]={'J','a','\0','c','k'};//结果显示,系统只当他们是数组,不会末尾添加操作
//以下写法,其实都数组或者字符串访问越界咯,C只提供警告,所以以后还得手动确定好边界。
printf("m[4]%c\n",m[4]);
printf("m[5]%c\n\n",m[5]);
printf("m1[4]%c\n",m1[4]);
printf("m1[5]%c\n\n",m1[5]);
printf("m3[3]%c\n",m3[3]);
printf("m3[4]%c\n",m3[4]);
printf("m3[5]%c\n",m3[5]);
printf("m3[6]%c\n\n",m3[6]);
printf("m4[3]%c\n",m4[3]);
printf("m4[4]%c\n",m4[4]);
printf("m4[5]%c\n",m4[5]);
printf("m4[6]%c\n\n",m4[6]);
printf("m5[4]%c\n",m5[4]);
printf("m5[5]%c\n\n",m5[5]);
printf("m6[4]%c\n",m6[4]);
printf("m6[5]%c\n\n",m6[5]);
printf("m7[4]%c\n",m7[4]);
printf("m7[5]%c\n\n",m7[5]);
printf("m8[4]%c\n",m8[4]);
printf("m8[5]%c\n\n",m8[5]);
//测试下sizeof函数
int intArray[] = {1,2};
double doubleArray[]={1,2};
printf("sizeof(intArray)=%zd\n",sizeof(intArray));//8
printf("sizeof(doubleArray)=%zd\n",sizeof(doubleArray));//16 返回空间
//此时木有strlen()函数可用,可以使用int length=sizeof(intArray)/sizeof(int);来求元素个数
}
程序运行结果如下: