JNI入门之C/C++基础四

1.4结构体与指针

1.4.1结构体概念

结构体(struct)

     结构体是由基本数据类型构成的、并用一个标识符来命名的各种变量的组合。结构体中可以使用不同的数据类型。

1.4.2结构体几种定义方式

第一种:只有结构体定义

  struct stuff{  

          char job[20];  

          int age;  

          float height;  

  }; 

第二种:附加该结构体类型的“结构体变量”的初始化的结构体定义

//直接带变量名

struct Man{

char name[20];

int age;

} m1, m2;

//下面这种写法:在定义结构体的同时声明结构体变量,并且给变量初始化

struct man{

         char name[20];

         int age;

}m1 = { "李四", 20 }, m2 = {"王五",23};

 

第三种:匿名结构体, 控制结构体变量的个数(限量版),声明几个就只有几个

struct{

         char name[20];

         int age;

}m1;

//下面这种写法声明两个结构体变量,并且初始化,那么这个结构体就只有这两个变量

struct {

         char name[20];

         int age;

}m1 = { "李四", 20 }, m2 = { "王五", 23 };

1.4.2结构体声明和内部成员变量的定义及访问:

1)      第一种方式(类似java构造方法)

//声明的同时初始化

struct man m1 = {"李四",20};

//或者先声明后初始化

struct man m2;

m2= {"王五",23};

2)      第二种方式

struct man m2;

strcpy(m2.name,"王五");

m2.age = 19;

1.4.3结构体嵌套

结构体的成员变量也是结构体,这时就叫结构体嵌套

struct teacher{

         char name[20];

};

struct man{

         char name[20];

         int age;

         struct teacher t;

};

void main() {

         struct man m ;

         m.age = 16;

         strcpy(m.name, "张三");

         strcpy(m.t.name, "李四");

         printf("%s,%d,%s\n", m.name, m.age,m.t.name);

         getchar();

}

1.4.3结构体指针

struct man{

         char name[20];

         int age;

};

void main() {

         struct man m = { "张三", 19 };

         struct man* p = &m;

         printf("%s,%d\n", m.name, m.age);

         printf("%s,%d\n", (*p).name, (*p).age);

         printf("%s,%d\n", p->name, p->age);

         getchar();

}

三种输出方式是等价的, p->”是“(*p).”简写形式

1.4.4结构体数组与指针

结构体数组遍历

struct man{

         char name[20];

         int age;

};

void main() {

         struct man mans[] = { { "张三", 23 }, { "李四", 24 } };

         int i = 0;

         for (; i < 2; i++){

                   printf("%s,%d\n",mans[i].name,mans[i].age);

         }

         getchar();

}

//下面这种方式遍历数组,采用指针

void main() {

         struct man mans[] = { { "张三", 23 }, { "李四", 24 } };

         struct man *p = mans;

         p = mans;

         for (; p < mans + 2; p++){

                   printf("%s,%d\n", p->name, p->age);

         }

         getchar();

}

1.4.5结构体与动态分配内存

struct man{

         char *name;

         int age;

};

void main() {

    //开辟内存,mp相当于一个结构数组名

         struct man *mp = (struct man *)malloc(sizeof(struct man) * 10);

         struct man *p = mp;

         p->name = "jack";

         p->age = 20;

         p++;

         p->name = "Rose";

         p->age = 19;

         struct man *loop_p = mp;

         for (; loop_p < mp + 2; loop_p++){

                   printf("%s,%d\n", loop_p->name, loop_p->age);

         }

         free(mp);

         getchar();

}

1.4.6 结构体中使用函数

struct a
{
    void (*func)(char *);
};

void hello(char *name)
{
    printf ("hello %s\n",name);
}

int main()
{
    struct a a1;
    a1.func = hello;     //给结构体中的函数指针赋值(函数名就是函数的入口地址)
    a1.func("illusion");  //利用函数指针调用函数
    system("PAUSE");
    return 0;
}

1.4.7 typedef类型取别名

typedef 类型取别名主要作用是为了书写简洁

typedef int Age;

Age a = 20;//可以直接用Age代替int使代码表达更简洁,更直观

typedef  struct Man{

         char name[20];

         int age;

} Man;

Man m1 = {“张三”,20};

//简写

typedef struct Woman{

         char name[20];

         int age;

} W, *WP;  //W 是woman结构体的别名, WP 是woman结构体指针的别名

typedef struct Girl{

         char * name;

         int age;

         void(*sayHi)(char*,char*);//函数指针

}Girl;

void sayHi(char* content, char* title){//函数具体实现

         MessageBox(0, content, title, 0);

}

void main() {

         Girl g = { "lisi", 20,sayHi };

         printf("%s,%d\n", g.name, g.age);

         g.sayHi("haha", "heihei");//调用函数

         getchar();

}

猜你喜欢

转载自blog.csdn.net/coderlei/article/details/80523456