###############################################################################
二维数组:
//int arr[2][3]={{1,2,3},{4,5,6}};
//数组名是数组第一个元素的首地址,也就是arr==&arr[0]
arr[0]是二维的数组名,也就是arr[0]==&arr[0][0]
arr[0][0]是元素
//一重指针和二维数组匹配
int *p=arr[0];
p++;p->arr[0][1];
//数组指针和二维数组匹配
int (*p1)[3]=arr; 数组指针
int*p[2]={arr[0],arr[1]}; 指针数组p[0]==arr[0]
//二重指针:指向的对象是一个指针,该指针指向一个int型数据。
int **p=arr //不匹配 原因:例如:p+1(偏移8字节)!=arr+1(偏移12个字节)
int **p,*p1; //定义指针
//绑定
int a=23;
p1=&a;
p=&p1;
################################################################################
结构体:是一种数据结构,解决了数组里不能存放多种数据类型的数据这种问题。
//基本数据结构(int flost char ~~~),数组是一种数据结构(缺点:元素单一)
#include <stdio.h>
#include <stdlib.h>
#include <sring.h>
struct infor //structinfor 是标识符,必须整体使用
{
charname[50]; //元素成员变量属性
char is_male;
int age;
}; //分号坚决不能少
//定义了一个内存,不占空间。
typedef struct infor S;
int main(void)
{
Printf(“sizeof(S)=%d.\n”,sizeof(S));//输出56表示类型所占字节的大小
/*
//定义了一个结构体变量,有变量才会分配空间。
//定义并且初始化
S s={“~~”,1,1};
//遍历元素,运算符(.)是专用于结构体变量访问个元素
printf(“结构体变量元素:%d %d%s”,s.is_male,s.age,s.name);
*/
/*
S s1;
//赋值个成员//(.)符号访问到结构体的成员变量名//数组名不能作为左值
strcpy(s1.name,"mm");
s1.is_male=1;
s1.age=17;
return 0;
*/
//初始化和数组很像,挨个进行赋值
Ss2={1,2}//(乱,0,0)
printf("结构体元素:%s %d %d",s2.name,s2.is_male,s2.age);
Ss3={1,2,3}//同s2
//初始化
Ss5={.age=27,.name={"~~"}};
printf("数组里的元素为:%s %d %d",s5.name,s5.is_male,s5.age);//~~ 027
}
//struct
//struct data
{
int a;
float b;
char c;
}s; //这个s是变量名的意思;定义类型的同时给出了结构体的变量名。
int main(void)
{
s.a=1;
s.b=3.14;
s.c=2;
}
struct st
{
int a;
float b;
char c;
};//结构体类型
int main(void)
{
//该类型的变量
struct st s;
s.a=1;
s.b=3.14;
s.c=2;
//结构体里.的实质
int*p_a=&s.a;
//&s的类型是struct st *
int *p_a=(int*)&s;
printf("*p_a=%d",*p_a);//1
float*p_b=(float *)((char *)&s+4);//将地址转化成char *类型==float *p_b=(float *)((long)&s+4);//分析:将地址值转化为数字,加上几就是加上几
printf("*p_b=%.2f",*p_b);
char*p_c=(char *)((char *)&s+8);
printf("*p_c=%c",*p_c);
struct st s1;
s1=s;//相同结构体之间可以互相赋值,在C++里有个称呼叫做:赋值构造。
}
void set_value_func(struct st arr[],int lenth)
{
int i=0;
for(i=0;i<lenth;i++)
{
scanf("%d",&arr[i].a);
scanf("%f",&arr[i].b);
scanf("%c",&arr[i].c);
}
}
void show_infor_func(struct st arr[],int lenth)
{
int i=0;
for(i=0;i<lenth;i++)
{
printf("%d%f %c\n",arr[i].a,arr[i].b,arr[i].c);
}
}
int main(void)
{
struct starr[3];
set_value_func(arr,3);
show_infor_func(arr,3);
return 0;
}
//结构体指针
struct st
{
int a;
float b;
char c;
};
void func(struct st *p)
{
p->a=1;
p->b=3.14;
p->c=2;
}
int main(void)
{
struct st s;
struct st*p=&s;
func(p);//调用函数赋值
==struct sts; func(&s);
}
//结构体的指针对齐规则
struct str1
{
int a;
char b;
short c;
}S1;//8
struct str2
{
char a;
char b;
int c;
}S2;//8
struct str3
{
int a;
char b;
char c;
}S3;//8
struct str4
{
struct str1s;
char a;
short b
}S4;//12
typedef struct str5
{
int a;
char b;
}ST,*P_ST;
//ST是struct str5的类型名 P_ST是structstr5*类型的别名
int main(void)
{
ST s1;
P_ST p;
p=&s1;
return 0;
}
struct str6
{
char a;
int b;
}s,*p=&s;
//s是struct str6的变量名,p是此结构体的指针变量名
struct str7
{
char ab;
short a[2];
}S7;//6
//1.结构体变量的地址是从四字节对齐的位置开始(0,4,8,c)
2.各成员在结构体里自身要对齐
char(0 12 3 ···)
int(0 48 c···)
short(0 24···)
3.成员之间不满足自身对齐需要填充(padding)
4.满足结构体自身对齐的最小倍数
5.默认是4字节对齐,最大的基本数和这个默认要相比较,取最小