# include <stdio.h>
# include <math.h>
# include <stdlib.h>
# define Size 5
typedef struct Table{
int *head;
int length;
int size;
} table;
table initTable(){
table table1;
table1.head=(int *)malloc(Size*sizeof(int));
if(!table1.head){
printf("初始化失败");
exit(0);
}
table1.length=0;//结构体变量通过.访问成员,结构体指针通过->访问成员
table1.size=Size;
return table1;
}
void displayTable(table table1){
for (int i=0;i<table1.length;i++) {
printf("%d ",table1.head[i]);
}
printf("\n");
}
//传参有一个数据复制的过程,传递参数的指针可以避免大量数据的复制,以指针作为参数传递有利于提高率
int max(int *intArr,int len){
int i,maxValue=intArr[0];
for(i=1;i<len;i++){
if(maxValue<intArr[i]){
maxValue=intArr[i];
}
}
return maxValue;
}
//定义结构体struct stu、结构体变量 stus(单独定义:stu stu1;)、结构体指针 *ps
struct stu{
char *name;//姓名
int num;//学号
int age;
char group;
float score;
} stus[] = {
{"Li ping" , 5, 18, 'C', 145.0},
{"Zhang ping", 4, 19, 'A', 130.5},
{"He fang" , 1, 18, 'A', 148.5},
{"Cheng ling", 2, 17, 'F', 139.0},
{"Wang ming" , 3, 17, 'B', 144.5}
},*ps;
//结构体指针作为参数传递,struct stu类型决定了结构体指针整数加减的变化长度
/*在传参时数组名被编译器看做指针*/
void average(struct stu *ps,int len){
int i;
float sum,average;
for(i=0;i<len;i++){
sum+=(ps+i)->score;
}
printf("average=%.2f\n",sum/len);
}
int main(void)//main的返回值为0,为int型,无需输入,返回值返回给系统,C语言函数只能返回一个数,当我们将数组名传入函数后数组会因操作改变,无需返回
{
table table1=initTable();
//向顺序表中添加元素
for (int i=1; i<=Size; i++) {
table1.head[i-1]=i;
table1.length++;
}
printf("顺序表中存储的元素分别是:\n");
displayTable(table1);
//结构体示例
int len = sizeof(stus) / sizeof(struct stu);
printf("Name\t\tNum\tAge\tGroup\tScore\t\n");
for(ps=stus; ps<stus+len; ps++){
printf("%s \t %d \t%d \t%c \t%.1f \n", ps->name, ps->num, ps->age, ps->group, ps->score);//指针访问结构体数据,结构体变量访问stu1.name
}
average(stus,len);
//一维数组示例
int arr[]={15,67,98,103,25,36};
int length=sizeof(arr)/sizeof(int);
printf("Max value is %d\n",max(arr,length)) ;
//二维数组示例 ,数组是线性存储结构的一种 ,C语言数组以行序线性保存数据 (Loc(i,j)=Loc(0,0)+(i*n+j)*L)L为数据类型长度
int A[2][3]={1,2,3,4,5,6};
int (*p)[3];//指针p指向含有三个元素的行向量 ,决定了指针p整数加减的长度 ,如下
printf("%d\n",sizeof(*(p+1)));//*(p+i)表示第一行整行数据 ,L=3*sizeof(int)=12
printf("%d\n",sizeof(*(p)));//第0行长度
p=A;//
printf("%p\n",A);//二维数组名等效为指针
printf("%p\n",(*(p+1)+2));//与A[1][2]地址完全相同
printf("%p\n",&A[1][2]);
printf("数组元素的四种等效表达:\n") ;
for( int i=0;i<2;i++){//写矩阵循环时习惯复制粘贴,注意修改i为j,否则易出现乱码输出, row为行col为列
for(int j=0;j<3;j++){//二维数组A[i][j]的四种等效形式,(*(p+i)在此处被编译器转换为该行第0个元素的首地址)
printf("%d \t", *(*(p+i)+j));
printf("%d \t", *(*(A+i)+j));//A与A[0]等价
printf("%d \t", *(A[i]+j));
printf("%d \t", *(p[i]+j));
}
printf("\n");
};
//数组名与指针的不同之处,可以说数组名是数据类型特定的一种指针,指针的类型体现在整数加减的变化长度上
//指针是int类型的指针长度为4字节,指针为向量的指针,长度为向量的字节长度,指针为结构体的指针,长度为结构体的字节数
int B[]={1,2,3,4,5};
int *o;
o=B;
printf("数组名的大小:\n") ;
printf("%d\n",sizeof(B)) ;
printf("指针的大小:\n") ;
printf("%d\n",sizeof(o)) ;
printf("数组名地址加1的变化:\n") ;
printf("%p\n",&B);
printf("%p\n",&B+1);
printf("指针地址加1的变化:\n") ;
printf("%p\n",&o);
printf("%p\n",&o+1) ;//数组名是常量指针,取首元素地址,指针是变量指针
return 0;
}