学习c语言的第11天

学习c语言的第11天喽~

我靠 ,终于把指针学完了,开始学字符串了兄弟们

第七章字符串

字符串其实就是字符数组但是不想这么说,因为打印的时候需要遍历很蠢

定义字符串:一般字符串就这两种写法

char cdata2[]="hello";//字符串变量,允许被修改  里面的每一个字都允许改变

char *pdata="hello";//字符串常量,不允许被修改  只能用不能改

char *p;//野指针,并没有明确的内存地址,他很危险

这个printf(%s,pchar) pchar是指针,意思就是%s这个格式后面的是指针

字符串和字符数组的区别

char cdata1[] = {'h', 'e', 'l', 'l', 'o', '\0'}; 这种定义方式创建的 cdata1 是一个字符数组,并且由于它以字符串结束标志 '\0' 结尾,所以它也可以被看作是一个 C 风格字符串。

当你使用双引号来初始化字符数组时,编译器会自动在字符串的末尾添加 '\0'。所以,cdata2 是一个以 '\0' 结尾的 C 风格字符串。

sizeof和strlen的区别(很重要)  

虽然数组名常表现为地址,但它有一些特殊性质。sizeof(数组名) 得到的是整个数组占用的内存空间大小,而不是一个指针的大小。

首先sizeof()是计算内存空间的大小的以字节为单位  strlen是计算有效字符的大小

  1. char *p:声明了一个名为 p 的指针变量,此变量的类型是 char *,也就是指向字符的指针。
  2. "hello":这是一个字符串常量。在 C 语言中,字符串常量是由双引号括起来的字符序列,并且在内存里以字符数组的形式存储,数组的最后一个元素是字符串结束符 '\0'。所以,"hello" 实际上是一个包含 'h''e''l''l''o' 和 '\0' 这 6 个字符的字符数组。
  3. p = "hello":把字符串常量 "hello" 的首地址赋值给指针 p。这就意味着,指针 p 现在指向了字符串 "hello" 的第一个字符 'h'

上面这个小图片我想说的是,这些其实只是把他们当做指针,无论如何64位计算机系统都是8个字节为一个地址(指针);

 char *p = "hello"; 时,指针 p 指向了字符串 "hello" 的首地址,也就是字符 'h' 的地址。接着调用 strlen(p) 时,strlen 函数会从 p 所指向的 'h' 开始,依次检查后续的字符 'e''l''l''o',每检查一个字符,计数器就加 1。当检查到 '\0' 时,函数停止计数,此时计数器的值为 5,所以 strlen(p) 返回 5

复习一下函数指针

malloc() memset() realloc()  free()的作用

Tips:strlen() 函数括号里可以填入指针和字符串

1.malloc相关知识点

原型:void *malloc(size_t size);

        malloc 函数用于在堆上分配指定大小的内存空间,但它并不对分配的内存进行初始化。这意味着这块内存中可能保留着之前其他程序或操作留下的数据,也就是所谓的随机数。如果在使用这块内存存储字符串或其他需要特定初始化值的数据结构之前,不进行初始化操作,就可能导致程序出现意外的行为。所以通常会使用 memset 函数将其初始化为特定的值,比如 '\0',以确保后续的操作能够正确进行。

malloc() 函数的作用是在堆内存中分配指定大小的连续内存块。所分配的内存内容是未初始化的,其中可能包含随机数据。使用完这块内存后,需要使用 free() 函数释放它,以避免内存泄漏。

2. memset()

原型:void *memset(void *s, int c, size_t n);

        memset() 函数的作用是把从 s 开始的连续 n 个字节的内存区域都设置为指定的值 c。通常会用它来初始化内存,将内存区域清零或者设置为某个特定的值。

3.realloc()

原型:void *realloc(void *ptr, size_t size);

        realloc() 函数的作用是调整之前分配的内存块的大小。它可以扩大或缩小已分配的内存块。如果扩大内存块,新增加的部分内容是未初始化的;如果缩小内存块,超出新大小的部分数据会被丢弃。

4.free()的作用:

        free(p) 会释放 p 所指向的内存,之后 p 就变成了一个野指针,因为它仍然保存着之前被释放内存的地址,但这块内存已经不再属于当前程序。

底层原理图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

真的想上岸啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值