前言:作为一个安卓程序员,如果不懂C/C++开发,那么安卓jni、NDK、视频解码、音频解码也没法开发,有需求我们就要学习,加油吧!今天开始我们快速讲解C语言,有Java基础的人适合看本博客。
----------分割线-----------
需要用的一些头文件:
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <Windows.h>
----------分割线--------
1.解释:结构体是一种构造数据类型,把不同的数据类型整合起来成为一个自定义的数据类型,看例子:
struct Man{
//成员
char name[20];
int age;
};
void main(){
//初始化结构体的变量
//1.
struct Man m1 = {"Jack",21};
printf("m1的值%s,%d\n",m1.name,m1.age);
//2.
struct Man m2;
//m2.name = "Rose";
m2.age = 20;
strcpy(m2.name,"Rose");
sprintf(m2.name,"K");
printf("m2的值%s,%d\n", m2.name, m2.age);
//类似JavaScript字面量赋值,只能在变量声明时赋值
struct Man m3 = m2;
printf("m3的值%s,%d\n", m3.name, m3.age);
getchar();
}
2.结构体的其他写法:
struct Man{
char name[20];
int age;
} m1, m2 = { "A", 20 };//m1结构体变量名
void main(){
strcpy(m1.name, "B");
m1.age = 11;
printf("m1的值%s,%d\n", m1.name, m1.age);
printf("m2的值%s,%d\n", m2.name, m2.age);
getchar();
}
3.匿名结构体(控制结构体变量的个数,相当于java中的单例):
struct{
char name[20];
int age;
}m1;
4.结构体嵌套:
struct Teacher{
char name[20];
};
struct Student{
char name[20];
int age;
struct Teacher t;
};
void main(){
struct Student s1 = { "A", 19, {"TT"} };
printf("s1的值%s,%d,%s\n", s1.name, s1.age, s1.t.name);
struct Student s2;
s2.age = 20;
strcpy(s2.name, "ss");
strcpy(s2.t.name,"tt");
printf("s2的值%s,%d,%s\n", s2.name, s2.age, s2.t.name);
getchar();
}
5.结构体嵌套2:
struct Student{
char name[20];
int age;
struct Teacher{
char name[20];
}t;
};
void main(){
struct Student s1 = { "A", 19, { "TT" } };
printf("s1的值%s,%d,%s\n", s1.name, s1.age, s1.t.name);
struct Student s2;
s2.age = 20;
strcpy(s2.name, "ss");
strcpy(s2.t.name, "tt");
printf("s2的值%s,%d,%s\n", s2.name, s2.age, s2.t.name);
getchar();
}
6.结构体与指针:
struct Man{
char name[20];
int age;
};
void main(){
struct Man m1 = {"w",20};
//结构体指针
struct Man *p = &m1;
printf("m1地址是%#x\n",p);
printf("%s,%d\n", m1.name, m1.age);
printf("%s,%d\n", (*p).name, (*p).age);
//“->”(箭头)是“(*p).”简写形式
printf("%s,%d\n", p->name, p->age);
getchar();
}
6_2.结构体与指针:
struct Man{
char name[20];
int age;
}M,*MP;
void main(){
//给结构体的成员变量赋值
strcpy(M.name,"A");
M.age = 20;
//给指针赋值
MP = &M;
printf("%s,%d\n",MP->name,MP->age);
getchar();
}
7.指针与结构体数组:
struct Man{
char name[20];
int age;
};
void main(){
struct Man mans[] = { {"A",1}, {"B",2}, {"C",3} };
//遍历结构体数组
//1.
struct Man *p = mans;
for (; p < mans + 2;p++) {
printf("%s,%d\n",p->name,p->age);
}
//2.
int i = 0;
for (; i < sizeof(mans) / sizeof(struct Man);i++){
printf("%s,%d\n", mans[i].name, mans[i].age);
}
getchar();
}
8.结构体的大小:
struct Man{
int age;
double weight;
};
void main(){
//结构体变量的大小,必须是最宽基本数据类型的整数倍
//提升读取的效率
struct Man m1 = { 20, 20.4 };
printf("地址:%#x\n大小:%d\n",&m1,sizeof(m1));
getchar();
}
9.结构体与动态内存分配:
struct Man{
char *name;
int age;
};
void main(){
struct Man *m_p = (struct Man*)malloc(sizeof(struct Man)*20);
struct Man *p = m_p;
//赋值
p->name = "jack";
p->age = 20;
p++;
p -> name = "rose";
p->age = 11;
struct Man *loop_p = m_p;
for (; loop_p < m_p + 2; loop_p++){
printf("%s,%d\n",loop_p->name,loop_p->age);
}
free(m_p);
getchar();
}
-----------分割线---------
typedef类型取别名。
优点:1.不同的名称代表在干不同的事情typedef int jint
2.不同情况下,使用不同的别名
//#if defined(__cplusplus)
//typedef _JNIEnv JNIEnv;
//typedef _JavaVM JavaVM;
3.书写简单
例子:
struct Man{
char name[20];
int age;
};
//Age int类型的别名
typedef int Age;
//Age int类型指针的别名
typedef int* Ap;
typedef struct Man JavaBean;
typedef struct Man* JM;
//结构体取别名
//简写
typedef struct Woman{
char name[20];
int age;
} W,*WP;//W是Woman结构体的别名,WP是Woman结构体指针的别名
//typedef struct Woman W;
//typedef struct Woman* WP;
void main(){
int i = 5;
Ap p = &i;
printf("i的地址是%#x\n",p);
//结构体变量
W w1 = {"Rose",20};
//结构体指针
WP wp1 = &w1;
printf("w1的地址:%#x,w1的name值:%s,age的值%d\n",wp1,w1.name,w1.age);
printf("w1的地址:%#x,w1的name值:%s,age的值%d\n", wp1, wp1->name, wp1->age);
getchar();
}
-------------分割线------------
结构体函数指针成员
struct Girl{
char *name;
int age;
//函数指针
void(*say)(char*);
};
//girl结构体类似于Java中的类,name和age类似于属性,say类似于方法
void say(char* text){
MessageBox(0,text,"title",0);
}
void main(){
struct Girl g1;
g1.name = "jack";
g1.age = 20;
g1.say = say;
g1.say("你好");
printf("%s,%d\n",g1.name,g1.age);
getchar();
}
--------完-------