C语言重点语法知识

一、结构体

 1. 结构体指针

 与一般指针类似结构体也可以使用结构体指针进行引用使用。结构体指针的定义方式如下:

struct Student stu = { 1001,"Li Lei",'M',1.87 };  //定义一个Student 的结构体变量stu
struct Student *p=&stu;    //定义一个Student的结构体指针变量来指向stu

当程序中定义了一个指向结构体变量的指针,就可以通过“指针名->成员变量名”的方式访问结构体变量的成员。 

#include <stdio.h>
 
typedef char NAME[10];
typedef double DOU;
typedef struct Student
{
    int num;
    NAME name;
    char sex;
    DOU height;
 
}Stu;
 
 
int main() {
    Stu stu = { 1001,"Li Lei",'M',1.87 };
    Stu* p = &stu;
    printf("学生信息:\n");
    printf("学号:%d\n", p->num);
    printf("姓名:%s\n", p->name);
    printf("性别:%c\n", p->sex);
    printf("年龄:%.2lf\n", p->height);
}

2. 结构体数组

指针可以指向结构体数组,即将结构体数组的起始地址赋给指针变量,这种指针就是结构体数组指针。

#include <stdio.h>
 
struct Student
{
    int num;
    char name[10];
    char sex;
    double height;
 
};
 
struct Student stus[3] = { {1001,"Li Lei",'M',1.78},
                            {1002,"Li Hua",'M',1.87},
                            {1003,"Han Mei",'W',1.65}
 
                            };
 
int main() {
    struct Student* p=stus ;//定义结构体数组指针p指向结构体数组stus
   
    for (int i = 0; i < 3; i++) {
        printf("学生%d的信息\n", i + 1);
        printf("学号:%d\n", p->num);
        printf("姓名:%s\n", p->name);
        printf("性别:%c\n", p->sex);
        printf("身高:%.2lf\n", p->height);
        printf("\n");
        p++;
    }
 
}

二、字符数组与字符串常量

两者主要的区别是所在存储区域不同,字符数组存储在栈或全局数据区中,而字符串常量存储在常量区中。

因此,字符数组可以更改,而字符串常量无法修改。

1. 字符常量

字符常量是一个用单引号括起来的单个字符(或字符转义序列或三字母词)。

2. 字符数组

字符数组是指用来存放字符数据的数组,每一个元素放一个字符。

使用字符串进行初始化字符数组,字符串中的每个字符均存储在字符数组中。

char string[] = "hello, world";

3.字符串常量

字符串常量是一个双引号括起来若干字符的序列。

"hello, world"为字符串常量被保存在常量区,其值不允许被修改。p保存的是该字符串常量的地址。

char *p = "hello, world";

三、预处理器

C语言预处理器是个简单的宏处理器,从概念上处理C程序源文本之后再让编译器正确读取源程序。在C语言的某些实现产品中,预处理器实际上是一个独立的程序,它读取原始的源文件并输出新的经过预处理的源文件,以作为C语言编译器的输入。在另一些实现产品中,一个程序一次性对源文件进行预处理和编译。

预处理器用特殊的预处理器命令行控制,这些命令行以字符#开头,不包含预处理器命令的行成为源程序文本行。

预处理器命令
命令含义
#define定义预处理器宏
#undef取消预处理器宏定义
#include插入另一源文件中的文本
#if根据常量表达式值有条件地包括一些文本
#ifdef根据是否定义宏名有条件地包括一些文本
#ifndef根据与 #ifdef 相反的测试有条件地包括一些文本
#else上述 #if、#ifdef、ifndef 或 #elif 测试失败时包括一些文本
#endif终止条件文本
#line提供编译器信息的行号
#elif上述  #if、#ifdef、ifndef 或 #elif 测试失败时根据另一常量表达式值包括一些文本
defined预处理器函数,在一个名称定义为预处理器宏时为1,否则为0
#运算符将宏参数换成包含参数值的字符串常量
##运算符从两个相邻记号生成一个记号
#pragma对编译器指定实现相关信息
#error将编译器错误换成指定消息

1. 词法规则

#define GETMATH #include <math.h>
GETMATH

上述代码经过预处理器处理后得到的C语言代码为如下,编译器是无法进行编译的。

#include <math.h>

预处理器将注释看作空白,不会进行任何替代。

2. 定义和替代

#define 预处理器命令把名称(标识符)定义为预处理器的宏,成为宏体的记号序列与这个名称相关联。预处理器在源文本中识别到宏名时,将使用宏体替换宏名

已经博主授权,源码转载自 https://pan.quark.cn/s/a4b39357ea24 常见问题解答 网页打开速度慢或者打不开网页? 受到多种因素的影响,对于非会员用户我们无法提供最优质的服务。 如果您希望得到最棒的体验,请至大会员页面("右上角菜单 → 大会员")根据说明操作。 请注意:受制于国际网络的诸多不确定性,我们无法对任何服务的可靠性做出任何保证。 如果出现了网络连接相关的问题,我们建议您先等待一段时间,之后再重试。 如果您在重试后发现问题仍然存在,请联系我们,并说明网络问题持续的时间。 图片下载后无法找到? 打开"右上角菜单 → 更多 → 修改下载路径",在弹出的对话框中可以看到当前图片的保存路径。 此外,由于网络因素,在保存图片之后,等待屏幕下方出现"已保存到..."后,才能在本地找到图片。 如何更改图片保存的目录? 请参见"右上角菜单 → 更多 → 修改下载路径"。 翻页不方便? 在点进某个图片后,通过在图片上向左或向右滑动,即可翻页查看下一个作品。 如何保存原图/导出动图? 长按图片/动图,在弹出的菜单中选择保存/导出即可。 输入账号密码后出现"进行人机身份验证"? 此为pixiv登陆时的验证码,请按照要求点击方框或图片。 在pxvr中注册pixiv账号后,收到验证邮件,无法访问邮件中的验证链接? 请复制邮件中的链接,打开pxvr中的"右上角菜单 → 输入地址"进行访问。 能否自动将页面内容翻译为汉语? 很抱歉,pxvr暂不提供语言翻译服务。 图片下载类型是否可以选择? 能否批量下载/批量管理下载? 已支持批量下载多图作品中的所有原图:找到一个多图作品,进入详情页面后,点击图片进入多图浏览模式,长按任意一张图片即可看到批量下载选项。 关于上述其他功能,我们...
考虑局部遮阴的光伏PSO-MPPT控制模型(Simulink仿真实现)内容概要:本文介绍了基于Simulink仿真实现的考虑局部遮阴的光伏PSO-MPPT控制模型,旨在通过粒子群优化(PSO)算法解决光伏发电系统在局部阴影条件下最大功率点跟踪(MPPT)的效率问题。文档不仅提供了该模型的技术实现方法,还列举了大量相关的MATLAB/Simulink仿真资源,涵盖电力系统、智能优化算法、机器学习、路径规划、信号处理等多个科研方向,适用于复现高水平期刊论文和开展创新性研究。文中强调科研需逻辑缜密、善于借力,并提倡结合实际仿真与理论分析以提升研究深度。 适合人群:具备一定电力电子、自动控制或新能源背景,熟悉MATLAB/Simulink环境,从事光伏系统优化、智能算法应用或相关领域研究的研发人员及硕博研究生。 使用场景及目标:①研究局部遮阴下光伏系统MPPT控制策略的性能提升;②利用PSO等智能优化算法解决非线性、多峰值优化问题;③复现SCI/EI级别论文中的MPPT控制模型;④开展光伏系统建模与仿真教学或项目开发。 阅读建议:建议读者结合文档提供的网盘资源,下载完整代码与模型文件,按照目录顺序逐步学习,重点理解PSO算法在MPPT中的应用机制,并通过修改参数、对比实验等方式深入掌握仿真细节,提升工程实践与科研创新能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值