//指针数组用于表示多个字符串
#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;
}
11.4动态数组
动态内存分配是在堆上进行,需要用户手动分配和销毁
动态内存分配函数需要加上头文件:#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;
}