首页 > 代码库 > IOS学习之路-- 指针&宏函数

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;};// 给结构体类型起个别名 :Stutypedef struct Person Student;// 此结构类似与上面的内容。 是上面两行的缩写typedef struct Dog {    int age} WangCai;
  •  指针的使用范围

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