C语言重点语法知识

一、结构体

 1. 结构体指针

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

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

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

#include 
 
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 
 
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 
GETMATH

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

#include 

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

2. 定义和替代

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

你可能感兴趣的:(C语言,c语言)