字符串操作和一级指针内存模型

字符串的基本操作

C语言的字符串是以0或者说’\0’结尾的字符串
C语言实际上根本没有字符串这个数据类型,全靠编译器来解释源代码里面的字符串,原理是用字符数组模拟字符串,只不过字符数组的最后一个元素是0(’\0’)
字符串的内存分配可在堆上、栈上、全局区、实现内存分配,通常字符串字面常量就是在全局数据区分配的内存

  • 字符数组初始化

指定长度初始化
当初始值的个数长于指定的数组长度时,编译器报错

buf3[2] = {'a', 'b', 'c', 'd'};

当初始值的个数小于指定的数组长度时,后面的数组元素默认初始化为0

char buf2[100] = {'a', 'b', 'c', 'd'}; 

后面的buf2[4]-buf2[99]自动初始化为 0,此时内存在栈上分配
不指定长度初始化
C编译器会自动帮程序员 求元素的个数

char buf1[] = {'a', 'b', 'c', 'd'}; //buf1是一个数组 不是一个以0结尾的字符串

用字符串初始化字符数组

编译器自动将字符串字面常量逐一赋值给数组元素,并将最后一个元素赋值为0
涉及到计算字符串长度的函数是strlen
计算数组长度的是操作符sizeof,数组和指针都是特定的数据类型

char buf3[] = "abcd"; /* buf3 作为字符数组 应该是5个字节 ,作为字符串 应该4个字节*/

通过数组下标和指针访问字符串内容

数组名是数组首元素的地址,是一个常量指针,不可修改;
因为编译器要保证局部变量内存首地址不变,这样才可以在函数返回时安全释放内存,否则一旦编译器允许修改数组名的值,则释放内存的时候有可能释放掉别的地址开头的内存或者浪费一部分内存
当sizeof作用于数组名的时候,返回的是整个数组的大小
当取地址符(&)作用于数组名的时候,返回的是整个数组的地址,返回的数据类型对应于一整块数组的内存
[]的本质 :和*p 是一样,只不过是符合程序员的阅读习惯,不过写成[]的效率稍微低一点,因为编译器多一条指令将其转换为指针与下标相加的操作,同时存在

p[i] = *(p+i)
buf5[i] ===> buf5[0+i]; ==> *(buf5+i);

一级指针内存模型

void main()
{
    char buf[20]= "aaaa";
    char buf2[] = "bbbb";
    char *p1 = "111111";
    char *p2 = malloc(100); strcpy(p2, "3333");
    system("pause");
    return ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值