黑马程序员—C学习笔记—指针字符串与其内存细节
来源:互联网 发布:拉拉肥捏脸数据 编辑:程序博客网 时间:2024/05/22 16:48
———–Java培训、Android培训、IOS培训、.Net培训、期待与您交流!————
本节是个人学习过程中的笔记,供初学者一起学习,欢迎大家批评指正,留言参与讨论,谢谢。 本节涉及到指针字符串和数组字符串的存储等基本问题,涉及很多细节,详细变化请参考代码,谢谢。
#include <stdio.h>#include <string.h>int main(){ char name[]="Jack"; char* name1="Jack"; char* name2="Jack"; char* name3="Jack\0"; char name4[]="Jack\0"; char n1[]={'J','a','c','k'}; char n2[]={'J','a','c','k','\0'};// char* n3={'J','a','c','k'};这两种做法应该是错误的,指针字符串应该指向字符常量,而右侧字符数组的值是可以改变的// char* n4={'J','a','c','k','\0'}; //如何把'\0'作为最后一个字符输入数组中呢?放在中间啥效果? char n5[]={'J','a','\0','k','\0'}; char n6[]={'J','a','\0','c','k'}; printf("name:%s\n",name); //这5行都输出 jack printf("name1:%s\n",name1); printf("name2:%s\n",name2); printf("name3:%s\n",name3);//默认都不输出\0 printf("name4:%s\n",name4); printf("n1:%s\n",n1);//输出jackjack ==》n1的定义方法有错,需要写出最后一个\0 否则容易出错 printf("n2:%s\n",n2); //输出jack //printf("n3:%s\n",n3);输出错误,程序中断 //printf("n4:%s\n",n4);输出错误,程序中断 printf("n5:%s\n",n5); //这两行输出ja ==》遇到\0就停止输出,printf函数中的%s机制类似strlen函数,都是遇到\0为判断标准 printf("n6:%s\n",n6);// printf("name:%s\n",name[]); //这两行错误,不符合语法// printf("name1:%s\n",name1[]); printf("sizeof(name)=%zd\n",sizeof(name)); //输出5, jack四个字符+'\0',输出的是name数组所占空间为5个字节 printf("sizeof(name1)=%zd\n",sizeof(name1));//输出8,name1为指针变量,所占空间为8个字节,如何输出这个字符串所占空间,即为5呢?? printf("sizeof(name2)=%zd\n",sizeof(name2));//8 printf("sizeof(name3)=%zd\n",sizeof(name3));//8 printf("sizeof(name4)=%zd\n",sizeof(name4));//6 printf("sizeof(\"Jack\")=%zd\n",sizeof("Jack"));//5 printf("sizeof(n1)=%zd\n",sizeof(n1));//4 printf("sizeof(n2)=%zd\n",sizeof(n2));//5// printf("sizeof(n3)=%zd\n",sizeof(n3));// printf("sizeof(n4)=%zd\n",sizeof(n4)); printf("sizeof(n5)=%zd\n",sizeof(n5));//5 printf("sizeof(n6)=%zd\n",sizeof(n6));//5 //sizeof()函数,如果是指针类型就输出8,其他只看元素个数说话,不管\0与否,只有char name[]="Jack";这种情况才默认加一个\0,计算成5. printf("strlen(name)=%zd\n",strlen(name)); //字符串长度,表示元素个数,'\0'不是有效原酸,所以输出都是4, printf("strlen(name1)=%zd\n",strlen(name1));//这四个都是4 printf("strlen(name2)=%zd\n",strlen(name2)); printf("strlen(name3)=%zd\n",strlen(name3)); printf("strlen(name4)=%zd\n",strlen(name4)); printf("strlen(n1)=%zd\n",strlen(n1));//8 printf("strlen(n2)=%zd\n",strlen(n2));//4 //printf("strlen(n3)=%zd\n",strlen(n3)); //printf("strlen(n4)=%zd\n",strlen(n4)); printf("strlen(n5)=%zd\n",strlen(n5));//2 printf("strlen(n6)=%zd\n",strlen(n6));//2 printf("name[1]=%c\n",name[1]);//四个都是a printf("name[1]=%c\n",*(name+1)); printf("name1[1]=%c\n",name1[1]); printf("name1[1]=%c\n",*(name1+1)); printf("address of name = %p\n",name); printf("address of name1 = %p\n",name1);//name1 name2地址相同 printf("address of name2 = %p\n",name2);// ==》指针字符串,字符串是常量放在静态内存中 printf("address of name3 = %p\n",name3); printf("address of name4 = %p\n",name4); printf("address of n1 = %p\n",n1); printf("address of n2 = %p\n",n2);// printf("address of n3 = %p\n",n3); //n3 n4 都输出地址0x4a,应该是报错// printf("address of n4 = %p\n",n4); printf("address of n5 = %p\n",n5); printf("address of n6 = %p\n",n6); printf("address of \"Jack\" = %p\n",&"jack");//两个jack地址相同,与指针字符串地址又不同。 printf("address of \"Jack\" = %p\n",&"jack");//有无指针指向的字符串常量,也是有区别的。 printf("address of \"Jack\\0\" = %p\n",&"jack\0");}
运行结果如下:
0 0
- 黑马程序员—C学习笔记—指针字符串与其内存细节
- 黑马程序员——ios学习笔记 C语言 指针
- 黑马程序员——IOS学习笔记(C语言指针)
- 黑马程序员——C语言学习笔记05 指针
- 黑马程序员——C语言中指针与其他数据类型的结合使用
- 黑马程序员—C学习笔记—typedef的使用以及细节
- 黑马程序员学习笔记-C指针小结
- 黑马程序员----C 语言学习笔记之数组指针与字符串指针
- 黑马程序员——C语言学习之数组——字符串——指针
- 黑马程序员——C复杂数据类型--数组、字符串、指针
- 黑马程序员——ios基础---C语言:字符串、指针
- 黑马程序员——C语言之字符串指针
- 黑马程序员--C语言自学笔记---10字符串、指针
- 黑马程序员——ios学习笔记 C语言 指针的应用
- 黑马程序员—C语言笔记—指针
- 黑马程序员——C语言笔记之指针
- 黑马程序员——C语言笔记之指针
- 黑马程序员——C语言学习笔记03 变量在内存中存储的细节、位运算
- 并发请求导致的业务处理安全风险及解决方案
- 黑马程序员-----浅谈面向对象的含义
- unit test pattern--1
- Python-memcached的基本使用
- jar命令行的详解
- 黑马程序员—C学习笔记—指针字符串与其内存细节
- 数字类型转换问题
- jquery滚动加载数据
- 分离颜色通道&多通道图像融合
- SpringMVC @ResponseBody
- Android应用中埋点监控的思考与设计
- 注册表编程之初试牛刀
- Codeforces Round #296 (Div. 2) - D. Clique Problem(贪心)
- java 内存分配