C语言学习——指针与数组、结构体

# 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;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值