黑马程序员—C学习笔记—补充字符串总结(定义、赋值、sizeof、strlen)
2015-03-27 22:07
253 查看
———–Java培训、Android培训、IOS培训、.Net培训、期待与您交流!————
本节是个人学习过程中的笔记,供初学者一起学习,欢迎大家批评指正,留言参与讨论,谢谢。
前面有两节已经写到字符串了,今天做一个补充总结(定义、赋值、sizeof、strlen)。
字符串可以由两种方式来定义,字符数组和字符指针。
定义的同时可以由两种方式来赋值,一个是{‘a’,’b’,…}字符数组元素的形式,另外一种是字符串形式”ab…”。
数组定义的字符串,除了数组名是一个类似指针的常量不可改变外,其他元素都可以单独访问改变。
指针定义的字符串,只能通过字符串形式”ab…”来赋值。而且字符串为常量,定义字符串的那个指针是可以指向其他地方的。
用字符串形式”ab…”来赋值实现的字符串,无论是什么定义方式,也不论”“中是否已经存在’\0’,系统都会在字符串末尾加上一个’\0’。
sizeof()函数,在碰到指针变量时都会返回8即指针大小(64位编译器),其他情况则计算该字符串所占内存字节数(把字符串里面自带的’\0’或者系统添加的’\0’,都计算在内)。
strlen()函数,原理就是不断匹配,不管是字符串内部自带的’\0’或者系统末尾添加的’\0’,只要碰到第一个’\0’,函数就会返回,正常情况下都返回字符串有效元素个数(不包括’\0’)。
详细变化请参考代码,谢谢。
程序运行结果如下:
本节是个人学习过程中的笔记,供初学者一起学习,欢迎大家批评指正,留言参与讨论,谢谢。
前面有两节已经写到字符串了,今天做一个补充总结(定义、赋值、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);来求元素个数 }
程序运行结果如下:
相关文章推荐
- 黑马程序员之C#学习笔记:StringBuilder字符串总结
- 黑马程序员-自己总结的java学习笔记(3)java字符串对象。
- 黑马程序员学习笔记——集合总结
- Java学习笔记-字符串总结
- 【黑马程序员】C语言学习笔记之字符串(十)
- 黑马程序员——Java学习笔记之11——“Collection集合”总结
- 黑马程序员——Java学习笔记之12——已接触的“设计模式”总结
- 黑马程序员——Java学习笔记之13——“反射”总结
- 黑马程序员-自己总结的java学习笔记(1)java语言基础。
- 黑马程序员-自己总结的java学习笔记(2)java语句基础。
- 黑马程序员-自己总结的java学习笔记(5)继承,接口,多态。
- 黑马程序员-自己总结的java学习笔记(6)集合类
- 黑马程序员-自己总结的java学习笔记(8)网络编程
- 黑马程序员_学习笔记:2) Java语法基础总结
- 黑马程序员_学习笔记9——字符串
- 黑马程序员_javse字符串学习总结
- <深入理解C指针>学习笔记和总结 第五章 指针和字符串
- 黑马程序员 - 学习笔记10 基础概念总结
- C/C++学习笔记9:sizeof总结
- 黑马程序员_学习笔记1泛型及动态代理类的总结