与一般指针类似结构体也可以使用结构体指针进行引用使用。结构体指针的定义方式如下:
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);
}
指针可以指向结构体数组,即将结构体数组的起始地址赋给指针变量,这种指针就是结构体数组指针。
#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指向结构体数组stusfor (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++;}}
两者主要的区别是所在存储区域不同,字符数组存储在栈或全局数据区中,而字符串常量存储在常量区中。
因此,字符数组可以更改,而字符串常量无法修改。
字符常量是一个用单引号括起来的单个字符(或字符转义序列或三字母词)。
字符数组是指用来存放字符数据的数组,每一个元素放一个字符。
使用字符串进行初始化字符数组,字符串中的每个字符均存储在字符数组中。
char string[] = "hello, world";
字符串常量是一个双引号括起来若干字符的序列。
"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 | 将编译器错误换成指定消息 |
#define GETMATH #include
GETMATH
上述代码经过预处理器处理后得到的C语言代码为如下,编译器是无法进行编译的。
#include
预处理器将注释看作空白,不会进行任何替代。
#define 预处理器命令把名称(标识符)定义为预处理器的宏,成为宏体的记号序列与这个名称相关联。预处理器在源文本中识别到宏名时,将使用宏体替换宏名。