int (*p)[3];
表示一个指向二维数组的指针变量 。该二维数组的列数为3或分解为一维数组的长度为3 。
int *p[3]
表示p是一个指针数组,有三个下标变量p[0],p[1],p[2]均为指针变量 。
指针数组也常用来表示一组字符串 , 这时指针数组的每个元素被赋予一个字符串的首地址 。指向字符串的指针数组的初始化更为简单 。例如在例10.32中即采用指针数组来表示一组字符串 。其初始化赋值为:
char *name[]={"Illagal day",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"
};
完成这个初始化赋值之后,name[0]即指向字符串"Illegal day",name[1]指向"Monday"...... 。
指针数组也可以用作函数参数 。
【例10-34】指针数组作指针型函数的参数 。在本例主函数中,定义了一个指针数组name,并对name 作了初始化赋值 。其每个元素都指向一个字符串 。然后又以name作为实参调用指针型函数day_name,在调用时把数组名name赋予形参变量name , 输入的整数i作为第二个实参赋予形参n 。在day_ name函数中定义了两个指针变量pp1和pp2,pp1被赋予name[0]的值(即*name),pp2被赋予name[n]的值即*(name+ n) 。由条件表达式决定返回pp1或pp2指针给主函数中的指针变量ps 。最后输出i和ps的值 。
main(){
static char *name[]={ "Illegal day",
"Monday",
"Tuesday",
【c语言函数定义数组 c语言定义数组的三种方式】 "Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"
};
char *ps;
int i;
char *day_name(char *name[],int n);
printf("input Day No: ");
scanf("%d",i);
if(i0) exit(1);
ps=day_name(name,i);
printf("Day No:%2d--%s ",i,ps);
}
char *day_name(char *name[],int n){
char *pp1,*pp2;
pp1=*name;
pp2=*(name+n);
return((n1||n7)? pp1:pp2);
}
【例10-35】输入5个国名并按字母顺序排列后输出 。现编程如下:
#include"string.h"
main(){
void sort(char *name[],int n);
void print(char *name[],int n);
static char *name[]={ "CHINA","AMERICA","AUSTRALIA","FRANCE","GERMAN"};
int n=5;
sort(name,n);
print(name,n);
}
void sort(char *name[],int n){
char *pt;
int i,j,k;
for(i=0;in-1;i++){
k=i;
for(j=i+1;jn;j++)
if(strcmp(name[k],name[j])0) k=j;
if(k!=i){
pt=name[i];
name[i]=name[k];
name[k]=pt;
}
}
}
void print(char *name[],int n){
int i;
for (i=0;in;i++) printf("%s ",name[i]);
}
说明:
1) 在以前的例子中采用了普通的排序方法 , 逐个比较之后交换字符串的位置 。交换字符串的物理位置是通过字符串复制函数完成的 。反复的交换将使程序执行的速度很慢 , 同时由于各字符串(国名)的长度不同 , 又增加了存储管理的负担 。用指针数组能很好地解决这些问题 。把所有的字符串存放在一个数组中,把这些字符数组的首地址放在一个指针数组中,当需要交换两个字符串时,只须交换指针数组相应两元素的内容(地址)即可 , 而不必交换字符串本身 。
2) 本程序定义了两个函数,一个名为sort完成排序,其形参为指针数组name,即为待排序的各字符串数组的指针 。形参n为字符串的'个数 。另一个函数名为print,用于排序后字符串的输出,其形参与sort的形参相同 。主函数main中,定义了指针数组name 并作了初始化赋值 。然后分别调用sort函数和print函数完成排序和输出 。值得说明的是在sort函数中,对两个字符串比较,采用了strcmp函数,strcmp函数允许参与比较的字符串以指针方式出现 。name[k]和name[j]均为指针 , 因此是合法的 。字符串比较后需要交换时,只交换指针数组元素的值,而不交换具体的字符串,这样将大大减少时间的开销 , 提高了运行效率 。
推荐阅读
- 五线谱下载,五线谱下载网
- 公众号怎么申请腾讯微博,公众号怎么申请腾讯微博认证
- 虚拟主机源码,虚拟主机源码是什么
- 椰子直播话术脚本,椰子鞋直播话术
- linux硬盘设置命令 更改linux硬盘大小为30g
- 短视频用什么拍摄剪辑,短视频用什么拍摄最好
- 鲫鱼喂什么长得最快视频,鲫鱼喂养吃什么
- 启明直播素材号,启明直播视频
- linux命令行显示月历 linux显示年月日