黑马程序员—C学习笔记—指针字符串与其内存细节

———–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'不是有效原酸,所以输出都是4printf("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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值