iOS笔记之_C语言结构体与预处理


一、结构体
1.什么是结构体
结构体是一种专门设计用来存储不同数据类型元素集合
结构体与数组的对比:
> 数组:只能由多个相同类型的数据构成。
> 结构体:可以由多个不同类型的数据构成。
2.结构体的定义
 结构体内部的元素,也就是组成成分,我们一般称为"成员"。
结构体的一般定义形式为:
   struct 结构体名{
      
     类型名1 成员名1;
     
     类型名2 成员名2;
     
     ……
     类型名n 成员名n;   
 };
 struct是关键字,是结构体类型的标志。
例如,定义一个Car
struct Car {
    int wheels; // 轮子数
    int speed; // 速度
};
定义结构体变量:
struct Car {
    int wheels; // 轮子数
    int speed; // 速度
}car;//直接定义变量
//单独定义结构体变量
struct Car car

3.结构体初始化与使用
初始化:
struct Car {
    int wheels; // 轮子数
    int speed; // 速度
}car;
car = {4,250};
//使用:
printf("%d",car.wheels);

4.结构体注意点
结构体类型的作用域
 1> 定义在函数外面:全局有效(从定义类型的那行开始,一直到文件结尾)
 2> 定义在函数(代码块)内部:局部有效(从定义类型的那行开始,一直到代码块结束)
不允许对结构体进行自身递归定义。
结构体内可以包含别的结构体。
只有在定义结构体变量时才会进行内存空间分配。

5.结构体数组
跟结构体变量一样,结构体数组也有3种定义方式
struct Student {
    char *name;
    int age;
};
struct Student stu[5]; //定义1
 
struct Student {
    char *name;
    int age;
} stu[5]; //定义2
 
struct {
    char *name;
    int age;
} stu[5]; //定义3
上面3种方式,都是定义了一个变量名为stu的结构体数组,数组元素个数是5。
初始化:
struct {
    char *name;
    int age;
} stu[2] = { {"MJ", 27}, {"JJ", 30} };
也可以用数组下标访问每一个结构体元素,跟普通数组的用法是一样的。

6.结构体与函数
 如果结构体作为函数参数,只是将实参结构体所有成员的值对应地赋值给了形参结构体的所有成员
 修改函数内部结构体的成员不会影响外面的实参结构体

7.指向结构体的指针
 1.指向结构体的指针的定义
 struct Student *p;
 
 2.利用指针访问结构体的成员
 1> (*p).成员名称
 2> p->成员名称
#include <stdio.h>
int main()
{
    struct Student
    {
        int no;
        int age;
    };
    // 结构体变量
    struct Student stu = {1, 20};
    
    // 指针变量p将来指向struct Student类型的数据
    struct Student *p;
    
    // 指针变量p指向了stu变量
    p = &stu;
    
    p->age = 30;
    
    // 第一种方式
    printf("age=%d, no=%d\n", stu.age, stu.no);
    
    // 第二种方式
    printf("age=%d, no=%d\n", (*p).age, (*p).no);
    
    // 第三种方式
    printf("age=%d, no=%d\n", p->age, p->no);
   
    return 0;
}



8.枚举
用来为某变量定义固定值。
格式:
一般形式为:enum 枚举名 {枚举元素1,枚举元素2,……};
enum Season {spring, summer, autumn, winter}; 
// 定义枚举变量
enum Season s;
//基本操作
s = spring; // 等价于 s = 0;
s = 3; // 等价于 s = winter;
使用注意:
1> C语言编译器会将枚举元素(spring、summer等)作为整型常量处理,称为枚举常量。
2> 枚举元素的值取决于定义时各枚举元素排列的先后顺序。默认情况下,第一个枚举元素的值为0,第二个为1,依次顺序加1。
enum Season {spring, summer, autumn, winter};
也就是说spring的值为0,summer的值为1,autumn的值为2,winter的值为3
3> 也可以在定义枚举类型时改变枚举元素的值
enum season {spring, summer=3, autumn, winter};
没有指定值的枚举元素,其值为前一元素加1。也就说spring的值为0,summer的值为3,autumn的值为4,winter的值为5

二、预处理
代码编译前对特殊的指令做解释。
以#开头,结尾不用分号。

1.宏定义
代码编译前对特殊的指令做解释。
以#开头,结尾不用分号。
> 不带参数的宏定义
define 宏名 字符串
 比如#define ABC 10
> 带参数的宏定义
#define 宏名(参数列表) 字符串
例如:
  #include <stdio.h>
  #define average(a, b) (a+b)/2
  
  int main ()
  {
     int a = average(10, 4);
     
     printf("平均值:%d", a);
     return 0;
 }

与函数的对比:
1> 宏定义不涉及存储空间的分配、参数类型匹配、参数传递、返回值问题。
2> 函数调用在程序运行时执行,而宏替换只在编译预处理阶段进行。所以带参数的宏比函数具有更高的执行效率。

2.条件编译
规定特定代码只在满足一定条件的时候才进行编译。
格式:
 #if 条件1
  ...code1...
 #elif 条件2
  ...code2...
 #else
  ...code3...
 #endif
例如:
#include <stdio.h> 
  #define MAX 1
  int main ()
  {
  #if MAX == 0
      printf("MAX是0");
  #elif MAX > 0
     printf("MAX大于0");
 #else
     printf("MAX小于0");
 #endif
     return 0;
 }
实际参与编译的代码为:
#include <stdio.h> 
 int main ()
 {
     printf("MAX大于0");
 }

一定写#endif,否则丢失一个大括号
其他用法:
//如果定义了 和 如果没有定义
#if defined()和#if !defined()
#ifdef和#ifndef

3.文件包含
两种形式:
#include <文件名>
#include "文件名"
文件包含不允许递归包含。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值