2023-2024-1 20231301 《计算机基础与程序设计》第十二周学习总结
作业信息
作业 | 链接 |
---|---|
作业课程 | <班级>(2023-2024-1-计算机基础与程序设计) |
作业要求 | <作业>(2023-2024-1计算机基础与程序设计第十二周学习总结) |
作业目标 | <《C语言程序设计》预习第十一章> 《C语言程序设计》 |
作业正文 | <博客>(第十二周学习总结) |
学习内容总结
《C语言程序设计》第十一章
数组名的意义以及在访问数组元素中的作用。
点击查看代码
#include<stdio.h>
int main()
{
int a[5],i;
for(i=0;i<5;i++)
{
scanf("%d",a+i);//a+i等于&a[i]
}
for(i=0;i<5;i++)
{
printf("%d ",*(a+i));//*(a+i)等于a[i]
}
return 0;
}
p+1不改变当前指针的指向,p仍然指向原来指向的元素;p++中p指向下一个元素,但是二者都表示指向下一个元素。
点击查看代码
#include<stdio.h>
int main()
{
int a[5],*p;
for(p=a;p<a+5;p++)
{
scanf("%d",p);//指针法引用数组元素
}
for(p=a;p<a+5;p++)
{
printf("%d ",*p);
}
return 0;
}
#include<stdio.h>
int main()
{
int a[5],i,*p=NULL;
p=a;
for(i=0;i<5;i++)
{
scanf("%d",&p[i]);//相当于p+i、a+i、&a[i]
}
for(i=0;i<5;i++)
{
printf("%d ",p[i]);//相当于*(p+i)、*(a+i)、a[i]
}
return 0;
}
通过二维数组的行指针和列指针来引用二维数组元素。
定义一个二维数组的行指针:
int (*p)[4];
定义了指向含有4个元素的一维整型数组的指针变量
p++指向下一行元素
int *p;
p=&a[0][0]; //定义了一个列指针并初始化
p++指向下一个元素的地址
点击查看代码
#include<stdio.h>
#define N 4
void InputArray(int *p,int n,int m)
//void InputArray(int (*p)[N],int n,int m)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
scanf("%d",&p[i*m+j]);
}
}
}
void OutputArray(int *p,int n,int m)
//void OutputArray(int (*p)[N],int n,int m)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
printf("%d ",p[i*m+j]);
}
}
}
int main()
{
int a[3][4];
//InputArray(a,3,4);
//OutputArray(a,3,4);
InputArray(*a,3,4);
OutputArray(*a,3,4);//向二维数组传递0行0列的地址
return 0;
}
点击查看代码
//指针数组用于表示多个字符串
#include<stdio.h>
#include<string.h>
#define MAX_LEN 10;
#define N 150
void SortString(char *pStr[],int n)
{
int i,j;
char *temp=NULL;
for(i=0;i<n-1;i++)
{
for(j=0;j<n;j++)
{
if(strcmp(ptr[j],ptr[i])<0)
{
temp=pStr[j];//交换字符串的指针
pStr[j]=pStr[i];
pStr[i]=temp;
}
}
}
}
int main()
{
int i,n;
char name[N][MAXLEN];
char *pStr[N];
scanf("%d",&n);
getchar();
for(i=0;i<n;i++)
{
pStr[i]=name[i];//将第i行地址赋给数组
gets(pStr[i]);
}
//char *pStr[N]={"America","England","Australia","Sweden","Finland"};
SortString(pStr,n);
for(i=0;i<n;i++)
{
puts(pStr[i]);
}
return 0;
}
动态内存分配是在堆上进行,需要用户手动分配和销毁。
动态内存分配函数需要加上头文件:#include<stdlib.h>
malloc:
原型:void *malloc(unsigned int size)
返回一个通用指针,可以用强制转换的方法将返回的指针值转换为所需的类型
int *pi=NULL;
pi=(int *)malloc(2);
申请2个字节的内存,pi指针变量指向这段存储空间的首地址
pi=(int *)malloc(sizeof(int));用于不能确定某种类型所占内存的字节数
calloc:
原型:void *calloc(unsigned int num,unsigned int size);
第一个参数表示申请空间的数量,第二个参数表示每个空间的字节数
pi=(int )calloc(10,sizeof(int));
pi=(int )malloc(10sizeof(int));
从安全考虑,前者更好。因为calloc能将分配的内存初始化为0。
free:
原型:void free(void *pi);
形参指向分配的内存地址,释放该指针指向的内存空间。
realloc:
原型:void *realloc(void *p,unsigned int size)
将p所指向的存储空间的大小改为size个字节
点击查看代码
#include<stdio.h>
#include<stdlib.h>
void InputArray(int *p,int m,int n)
{
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&p[i*n+j]);
}
}
}
double OutputArray(int *p,int m,int n)
{
int i,j,sum=0;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
sum+=p[i*n+j];
}
}
return (double)sum/(m*n);
}
int main()
{
int *p=NULL,m,n;
double aver;
scanf("%d",&m);//m个班级
scanf("%d",&n);//一个班级n个学生
p=(int *)calloc(m*n,sizeof(int));
if(p==NULL)
{
exit(0);
}
InputArray(p,m,n);
aver=Average(p,m,n);
printf("%lf\n",aver);
free(p);//释放动态分配的内存空间
return 0;
}
学习中的问题
- Wireshark
Wireshark实践 - 网站设计
网站设计