人之所以痛苦,那是因为你在成长。--------magic_guo
1.指针数组
数组是存放一批同类型数据的容器,其中的元素可以是整型、浮点型、字符,也可以是指针型等,存放内存地址的数组叫做指针数组,就像返回指针类型的函数一样(被称为指针函数)。
定义指针数组的方式:
类型名 * 数组名 [数组长度]
例如:int * num[4]
这个定义的理解:根据运算符先后等级,括号优先级高,num先于中括号结合,表示数组,然后与前面的int * 结合,表示此数组存放的是指向整型数据的指针,4表示此指针数组的长度为4。
指针数组的应用:
# include<stdio.h>
# include<string.h>
//使用指针数组将若干字符串按顺序输出
int main(void)
{
void sort(char * name[], int n); //函数声明
void print(char * name[], int n); //函数声明
// 定义指针数组,进行初始化,它的元素分别指向5个字符串
char * name[] = {"Follow me", "BASIC", "Great Wall", "FORTRAN", "Computer design"};
int n = 5;
sort(name, n);
print(name, n);
return 0;
}
void sort(char * name[], int n) //定义sort函数,使用选择排序
{
char * temp;
int i, j, k;
// 下面使用选择排序,先将数组中最小的元素排在第一位,然后依次进行。
for (i=0; i<n-1; i++)
{
k = i;
for (j=i+1; j<n; j++)
{
if (strcmp(name[k], name[j])>0)
k = j;
}
if (k!=i)
{
temp = name[i];
name[i] = name[k];
name[k] = temp;
}
}
}
void print(char * name[], int n)
{
int i;
for (i=0; i<n; i++)
{
printf("%s\n", name[i]);
}
}
结果:
这两个函数都使用了指针数组作为参数,当把name作为实参传进函数,这时候name指向的是指针数组的第0号元素,但是第0号元素也是一个char类型的指针变量,在sort函数中,因此要将temp定义为指针类型;在print函数中,使用%s可直接将字符串输出。
这里最难理解的是选择排序,选择排序的思路方法都是一样的,在全局范围内找出最小的,然后找出第二小的,以此类推;可能有时候写代码的方式不同,但是万变不离其宗。
strcmp(str1, str2)此函数是字符串函数库中的函数,使用于字符串的比较。
比较规则:在英文字典中,位置在后面的为“大”。另外,小写字母在大写字母的后面,所以比如说小写的“0”,stolen和大写的“O”,stOlen,相比较;
strcmp(stolen, stOlen) >0;
此函数只能用来比较字符串,不能比较的单个字符。
2.多重指针
多重指针即:指向指针的指针;可以分为更多的等级;
和上面所说的指针数组一样,name数组存放了各个元素的地址,而且数组名又是数组元素的首地址,name指向类首元素的地址,则首元素也是指针类型,因此name则是指针的指针;
定义指针数据的指针变量:
例如:
int ** p;
理解:*运算符的结合是从右到左的,p相当于 * ( * p),*p是指针变量,则p则是指针的指针。
例题1:
# include<stdio.h>
// 使用指针数据的指针变量
int main(void)
{
char * name[] = {"Follow me", "BASIC", "Great Wall", "FORTRAN", "Computer design"};
char **p;
int i;
for (i=0; i<5; i++)
{
p = name+i;
printf("%s\n", *p);
}
return 0;
}
例题2:
# include <stdio.h>
int main(void)
{
int a[5] = {2, 4, 6, 8, 10};
int * num[] = {&a[0], &a[1], &a[2], &a[3], &a[4]};
int **p, i;
p = num;
for (i=0; i<5; i++)
{
// printf("%d\n", *(*p+i));
printf("%d\n", **p);
p++;
}
return 0;
}
指针与数组的结合形很强,一般要对数组进行操作,避免不了要是用指针;在概念上指针数组与多重指针是一样的,只要理解了指针数组,则多重指针也易如反掌,虽然关于指针的知识比较绕,但是我们要看清指针的真面目!
加油!