IOS学习之路-- 指针&宏函数

  • 如果*p被()包住,说明指针变量p将来指向的是函数
 //声明一个指针变量
    //int (*p)(int, int) = sum;
    int (*p)(int, int);
    p = sum;
    
    // 如果*p被()包住,说明指针变量p将来指向的是函数
    
    // 最左边的void说明p指向的函数没有返回值
    // 最右边的()说明p指向的函数没有形参
    void (*p)();
    
    // 函数名test就是test函数的地址
    // 将test函数的地址赋值给了指针变量p
    // 指针变量p成功指向了test函数
    p = test;
    
    // 利用指针变量p间接调用了test函数
    //(*p)();
    
    //test();
    p();
  • 结构体占用的空间大小

默认情况下,一个结构体变量所占有的存储空间是所有成员的总和。

sizeof计算的结构体所占用存储空间时,返回的值必须是最大成员的倍数。

  •  结构体的省略写法

  省略了结构体的名称,这种方法没有重用性。

  在结构图的最后加入的内容是  同时定义的变量。

    struct
    {
        double width;
        double height;
    } s;

 

  注意: 如果想给结构体使用{}的方式一次性赋值,只能在定义变量的同事进行。

  •  结构体作为函数参数时,只是成员的值传递(修改函数内部的结构体,并不影响外面的结构体)

 

struct Person {
    int age;
};


// 这种方式是值传递, 不会真的改变nochange的值
void changePersonWithAge1(struct Person nochange) {
    nochange.age = 100;
}

// 这种传递的是指针,指针指向同一个内容,可以真正改变
void changePersonWithAge2(struct Person *change) {
//    (*change).age = 100;
    change->age = 100;  // 等价于上面那行。
}

int main()
{
    struct Person p1 = {5};
//    changePersonWithAge1(p1);
    changePersonWithAge2(&p1);  // 引用传递,要传递指针
    
    printf("%d\n", p1.age);

}
  •  宏定义:

  #define 宏名 值

  #undef 宏名  

  作用:宏替换,在翻译之前,将代码中的所有宏名都替换成对应的值。

  宏名最好都用大写,跟函数区分开。可以使用在任何地方(代码段中,头部,任何地方)

// 带参数的宏定义
// 宏替换只是纯粹的文本替换,把左边的宏换成右边的东西,并不会进行任何运算
// 参数和结构都必须用()包住
#define PING_FANG(x)  ((x)*(x))
  •  预处理指令

    不能递归包含: 自己包含自己,a.h include a.h

    不能交叉包含:a.h incldue b.h, b.h include a.h

    防止.h的文件内容被包含多次。用预处理命令。  文件名用A_H的方式来定义。

 #ifndef 文件名
 #define 文件名
 
 ..文件内容..
 
 #endif
  •  typedef 起别名  

  typedef int Myint

  typedef char * String1 

struct Person {
    int age;
};

// 给结构体类型起个别名 :Stu
typedef struct Person Student;

// 此结构类似与上面的内容。 是上面两行的缩写
typedef struct Dog {
    int age
} WangCai;
  •  指针的使用范围

  需要间接的修改某个变量的值。

IOS学习之路-- 指针&宏函数,,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。