2025年c语言字符串申明空间,字符空间与非字符空间的操作(C语言)

c语言字符串申明空间,字符空间与非字符空间的操作(C语言)空间操作 就是一个从头找到尾 遍历 的过程 字符空间与非字符空间的区别 1 结束符不同 字符空间结束符是 0 非字符空间没有结束符 通过个数 字节 来限定空间大小 2 是否是一个字符一个字符地读 字符空间是 非字符空间不是 一 字符空间的操作

大家好,我是讯享网,很高兴认识大家。

空间操作,就是一个从头找到尾(遍历)的过程。

字符空间与非字符空间的区别:

1、结束符不同。

(字符空间结束符是'\0',非字符空间没有结束符,通过个数(字节)来限定空间大小)

2、是否是一个字符一个字符地读。

(字符空间是;非字符空间不是)

一、字符空间的操作

1、用char *或者const char *来操作。

错误用法:

void fun(char *p) // 给的是char *

{

p[1000] = '1'; // 用语法角度,这样写是没问题的;但是1000超出了char的范围

}

2、字符空间操作的最小模板 / 框架:

void fun(char *p) // p就是首地址

{

int i = 0;

while(p[i]) // 当p[i] == 0时,结束循环

{

// p[i]的操作

i++;

}

}

3、strlen:统计字符长度

// man strlen

#include

size_t strlen(const char *s); // const说明,只是统计,不想修改其值

size_t strlen(const char *s)

{

// 1、错误处理:判断输入参数是否合法

if(p == NULL) // NULL实际上就是0。它在编译器中是一个宏,宏体比较复杂。

{

// 出错处理

}

// 2、内存处理:办法只有1种:从头到尾逐一处理(遍历)。

// 框架:

while(s[i])

{

// 具体的处理操作

// s[i] = xx;

// a = s[i];

// ...

i++;

}

}

二、非字符空间的操作

1、非字符空间的类型很多

unsigned char *p;

int *p;

short *p;

struct abc *p;

...

2、非字符空间操作的最小模板 / 框架:

void fun(unsigned char *p, int len) // p是首地址,长度限定了空间大小

{

int i;

for(i = 0; i < len; i++)

{

// 具体的处理操作

// p[i] = xx;

// a = p[i];

// ...

i++;

}

}

3、问题来了:

void fun(unsigned char *p, int len) // fun读内存的方式:一个字节一个字节地读

{

int i;


讯享网

for(i = 0; i < len; i++)

{

// 具体的处理操作

// p[i] = xx;

// a = p[i];

// ...

i++;

}

}

int main()

{

struct sensor_data buf; // buf读内存的方式:一个结构体一个结构体地读

fun(&buf, sizeof(buf)*1); // 错误!!两种读内存的方式不一致

return 0;

}

由于非字符空间的类型特别多,因此没法只用一种unsigned char *去代表非字符空间的那么多种类型。

4、void *:非字符空间(数据空间)的标识符。

(1)什么是void *?

void本来不能修饰*(不可能空着去读内存),因此它是编译器的一种形参化处理,只是为了在接收非字符空间时,通用性更强一些(可以适配各种非字符空间的类型)。

它可以代表任意类型,只是告诉编译器这是一个指针。

传任何指针给它,void都可以接收,编译器不会报错。

(2)函数声明是void *时,在函数实现中如何使用void *?

void *只是编译器对非字符空间的一种形参化处理。最终使用时,还得强制类型转换成具体的非字符空间类型。

int fun(void *buf, int len)

{

unsigned char *tmp = (unsigned char *)buf; // 通过强制类型转换,把buf接收的数据,转换成一个字节一个字节地读的unsigned char *指针

// 此处利用unsigned char *指针,进行一些遍历等操作

}

(3)当有了void *表示非字符空间后:

若在函数入参中看到int *、short *、long *等,则只表示传递一个值(反向修改)

若在函数入参中看到int 、short 、long 等,则表示传递一个地址/指针(反向修改)

看到void *,则表示传递一个非字符空间(反向修改)

看到char *或const char *,则表示传递一个字符空间(只是看看)

// 只传递一个值

void fun(int *p);

int main()

{

int a = 10;

fun(&a); // 只传递一个值

}

// 传递一个非字符空间

void fun(void *p);

// 传递一个字符空间

void fun(char *p);

void fun(const char *p);

5、举例:只看函数声明,理解函数功能

例1:只看memcpy函数的声明,理解该函数

// man memcpy:

#include

void *memcpy(void *dest, const void *src, size_t n);

// void *:非字符空间标识符。n:非字符空间的大小

// 目的内存可改;原空间的内容不可改。

例2:只看recv函数的声明,理解该函数

// man recv:

#include

#include

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

// sockfd:int值的id号,通过值传递,只是用一下

// void *:传的是非字符空间。len:非字符空间的大小。

// flags:标识

例3:只看send函数的声明,理解该函数

// man send:

#include

#include

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

// sockfd:int值的id号,通过值传递,只是用一下

// void *:传的是非字符空间。len:非字符空间的大小。

// const:原空间的内容不可改。

// flags:标识

小讯
上一篇 2025-01-06 15:36
下一篇 2025-03-19 08:40

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/68744.html