---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Unity开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
前几天出差有事儿没学习,今天主要学习了复杂数据类型中的一些其他类型
一、其他数据类型
1.全局变量和局部变量
#include <stdio.h>
/*
根据变量的作用域,可以分为:
1.局部变量:
1>定义:在函数(代码块)内部定义的变量(包括函数的形参)
2>作用域:从定义变量的那一行开始,一直到代码块结束
3>生命周期:从定义变量的那一行开始分配存储空间,代码块结束后,就会被回收
4>没有固定默认的初始值就是0
2.全局变量
1>定义:在函数外面定义的变量
2>作用域:从定义变量的那一行开始,一直到文件结尾(能被后面的所有函数共享)
3>生命周期:程序已启动就会分配存储空间,程序退出时才会被销毁
4>默认的初始值就是0
*/
int age;
void test()
{
int age;
age = 10;
printf("%d\n",age);
}
int main(int argc, const char * argv[])
{
printf("%d\n",age);
// int age = 20;
printf("%d\n",age);
test();
printf("%d\n",age);
return 0;
}
2.结构体
1>基本使用
#include <stdio.h>
/*
数组:只能由多个相同类型的数据构成
结构体:可以由多个不同类型的数据构成
*/
int main(int argc, const char * argv[])
{
// int ages[3]= {10, 11 , 29};
//1.定义结构体类型
struct Person
{
//里面的3个变量,可以称为是结构体的成员或者属性
int age;//年龄
double height;//身高
char *name;//姓名
};
//2.根据结构类型,定义结构体变量
struct Person p = {20, 1.55, "jack"};
p.age = 30;
p.name = "rose";
printf("age=%d, name=%s, heigth=%f\n",p.age,p.name,p.height);
/*错误写法
struct Person p2;
p2 = {20 ,1.67,"jack"};
相当于
int ages[5];
age = {1 ,2 , 3 ,5 ,2};
是错误的
*/
struct Person p2 = {.height = 1.78 ,.name = "joke",.age = 46};
printf("age=%d, name=%s, heigth=%f",p2.age,p2.name,p2.height);
return 0;
}
2>内存分析
#include <stdio.h>
void test();
void test1();
int main(int argc, const char * argv[])
{
test1();
test();
return 0;
}
void test1()
{
struct Student
{
int age;//4个字节
char a;//1个字节
char *name;//8个字节
};
struct Student stu;
//stu.age = 20;
//stu.name = "jack";
//补齐算法(对齐算法) 本节中有详解,看
//结构体所占用得存储空间 必须是 最大成员字节数的倍数
int s = sizeof(stu);
printf("%d\n",s);
}
void test()
{
//1.定义结构体类型(并不会分配存储空间)
struct Date
{
int year;
int month;
int day;
};
//2.定义结构体变量(真正分配存储空间)
struct Date d1 = {2011, 4 ,10};
struct Date d2 = {2013 , 8 , 9};
//会讲d1所有成员的值对应的值赋值给d2的所有成员
d2 = d1;
d2.year = 2010;
printf("%d - %d -%d\n",d1.year ,d1.month ,d1.day);
printf("%d - %d -%d\n",d2.year ,d2.month ,d2.day);
d2.month = 12;
/*
printf("%p - %p -%p\n",&d1.year ,&d1.month ,&d1.day);
int s = sizeof(d1);
printf("%d\n",s);
*/
}
3>变量的多种定义
#include <stdio.h>
/*
1.定义结构体变量的3种方式
1>先定义类型,再定义变量(分开定义)
struct Student
{
int age;
};
struct Student stu;
2>定义类型的同时定义变量
struct Student
{
int age;
}stu;
struct Student stu2;
3>定义类型的同时定义变量(省略了类型名称)
strct
{
int age;
}stu;
*/
int main(int argc, const char * argv[])
{
//定义结构体变量的第3种方式,但是这种方式只能使用一次,下次使用还需要重新定义
struct{
int age;
char *name;
}stu;
/*结构类型不能重复定义 这是错误写法
struct Student
{
int age;
};
struct Student
{
double height;
};
struct Student stu;
*/
/*错误写法:结构体类型重复定义
struct Student
{
int age;
double height;
char *name;
}stu;
struct Student
{
int age;
double height;
char *name;
}stu2;
*/
/*
这句代码做了两件事情
1.定义结构体类型
2.利用新定义好的类型来定义结构体变量
*/
//定义变量的第2种方式:定义类型的同时定义变量
/*
struct Student
{
int age;
double height;
char *name;
}stu;
struct Student stu2;
*/
/*
//定义变量的第1种方式:
//1.类型
struct Student
{
int age;
double height;
char *name;
};
//2.变量
struct Student stu = {20 , 1.78 ,"jack"};
*/
return 0;
}
4>结构体数组
#include <stdio.h>
int main(int argc, const char * argv[])
{
struct RankRecord
{
int no;
char *name;
int score;
};
/*
struct RankRecord r1 = {1 , "jack" , 5000};
struct RankRecord r2 = {2 , "jim" , 500};
struct RankRecord r3 = {3 , "jake" ,300};
*/
//int ages[3] = {10 ,19 ,29};
//int ages[3];
//对齐算法
//能存放3个结构体变量,每个机构体变量占16个字节
struct RankRecord records[3]=
{
{1,"jack",5000},
{2,"jim",500},
{3,"jake",300}
};
records[0].no = 4;
//错误写法
//records[0] = {4, "rose" ,9000};
for (int i = 0; i < 3; i++)
{
printf("%d\t%s\t%d\n",records[i].no,records[i].name,records[i].score);
}
//这里为什么size=24,而不是size=16
printf("size=%d\n",sizeof(records[1]));
return 0;
}
5>指向结构体的指针
#include <stdio.h>
/*
1.指向结构体的指针的定义
struct Student *p;
2.利用指针访问结构体的成员
1>(*p).成员变量
2>p->成员变量
*/
int main(int argc, const char * argv[])
{
struct Student
{
int no;
int age;
};
//结构体变量
struct Student stu = {1 ,20};
//指针变量p将来指向struct Student类型的数据
struct Student *p = &stu;
//指针变量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;
}
6>嵌套定义
#include <stdio.h>
int main(int argc, const char * argv[])
{
struct Date
{
int year;
int month;
int day;
};
//类型
struct Student
{
int no;//学号
struct Date birthday;//生日
struct Date ruxueDate;//入学日期
//这种写法是错误的
//struct Student stu;
};
struct Student stu = {1 , {2000,9,10},{2012,9,10}};
printf("year=%d,month=%d,day=%d\n",stu.birthday.year,stu.birthday.month,stu.birthday.day);
return 0;
}
3.枚举类型
//枚举用在有特殊规定使用整数的变量,变量之间依次递增
#include <stdio.h>
int main(int argc, const char * argv[])
{
//1.定义枚举类型
enum Season
{
spring,
summer,
autumn,
winter
};
//2.定义枚举变量
enum Season s = spring;
enum Season s2 = summer;
enum Season s3 = autumn;
enum Season s4 = winter;
printf("%d\n",s);
printf("%d\n",s2);
printf("%d\n",s3);
printf("%d\n",s4);
return 0;
}
4.数据类型总结
/*
一、基本数据类型
1.int
1>long int、long:8个字节 %ld
2>short int、short:2个字节 %d %i
3>unsigned int、unsigned:4个字节 %zd
4>signed int、signed 、int:4个字节 %d %i
2.float\double
1>float:4个字节 %f
2>double:8个字节 %f
3.char
1>1个字节 %c %d
2>char类型保存在内存中得是它的ASCII值
‘A’-->65
二、构造类型
1.数组
1>只能由同一种类型的数据组成
2>定义:数据类型 数组名[元素个数];
2.结构体
1>可以由不同类型的数据组成
2>先定义类型,再利用类型定义变量
三、指针类型
1.变量的定义
int *p;
2.间接操作变量的值
int a = 10;
p = &a;
*p = 20;
四、枚举类型
使用场合:当一个变量只允许有几个固定取值时
*/
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Unity开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------