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

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

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

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:标识

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值