一、结构体
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 预处理器命令把名称(标识符)定义为预处理器的宏,成为宏体的记号序列与这个名称相关联。预处理器在源文本中识别到宏名时,将使用宏体替换宏名。
8866

被折叠的 条评论
为什么被折叠?



