之 指针数组与指向指针的指针数组
指针的普遍用途不单单在于数组指针、函数指针等,能够说没有指针不能指的东西,那指针还能指什么呢?ide
今天和你们一块儿学习指针的最后一篇,指针数组和指向指针的指针以及指针数组作main函数参数。可能你会以为咱们一直学的不就是指针数组吗?错!咱们以前学的是数组指针,这两个概念但是千差万别的哦!一样的,你是否是对指向指针的指针也产生了迷惑呢? 不用着急,一块儿来看一下吧!函数
一:指针数组一个数组中的全部元素都为指针类型的数据,这个数组就是指针数组。显而易见的,学习
指针数组的元素的数据类型为指针类型,是指针量组成的数组。spa
而数组指针中的数组的元素是非指针类型,而是指针变量指向数组首地址。指针
指针数组的通常形式:blog
类型名 *数组名[数组长度]排序
好比: int *p[4]; 图片
不要写成 int (*p)[4],这是一个指向一维数组的行指针字符串
咱们以前学过,字符串是存放在字符数组之中的,以下所示为一个字符串在数组中的存储。
z |
h |
a |
o |
y |
u |
q |
\0 |
咱们能够定义一个指针数组,让该数组中的每个指针类型的元素指向各字符串中的字符。
以下图所示:
这样的好处是:节约指向,移动指针变量的值比移动字符串所花的时间更好,效率也高。
/* 字符串按从小到大排序 */ #include <stdio.h> #include <string.h> void sort(char *name[],int n); //声明函数 main() { /*定义指针数组,name[]是指针数组变量,name[0]指向字符串"Zai"*/ char *name[]={"zai","Demo","C S","Apple"}; int i,n=4; sort(name,n);//调用函数 for(i=0;i<n;i++) { printf("%s\n",name[i]); //“%s”容许输出首地址输出整个字符串 } } void sort(char *name[],int n) { char *temp; int i,j; for(i=0;i<n-1;i++) { j=0; /*一趟排序*/ for(j=0;j<n;j++) { if(strcmp(name[j],name[j+1])>0) //比较字符串大小 { temp=name[j]; name[j]=name[j+1]; name[j+1]=temp; } } } } |
一个指针变量中存放的是一个指针变量的指针,那么这个指针变量就是指向指针变量的指针变量,简称为指向指针的指针。定义为**p
好比:
int i=2,*p1,**p2; p1=&i; p2=&p1; |
上述代码能够描述为如下简图:
很明显的看出,指针变量p2存储着指针变量p1的地址,而p1又存储着变量i的地址。
这样的话,对变量i的访问就有三种方式了 ,分别是:i , *p1 , **p2
咱们前面刚讲过了指针数组,指针数组中都是指针变量,可是它们确实是组成了一个数组,既然是数组,咱们能够设一个指针变量来指向这个数组,也就是指向数组首地址,也就是指向了数组的第一个指针元素,这是指针指向指针,因此用到了指向指针的指针。
/* 字符串输出 */ #include <stdio.h> //#include <string.h> main() { char *name[]={"zhao","yu","qiang","51cto"}; //定义指针数组 char **p; //定义指向指针的指针,也便是指向指针数组的指针 for(p=name;p<name+4;p++) { printf("%s\n",*p); } } |
懂得了指针数组之后,还有一个重要应用,就是指针数组做为main函数参数,不过咱们就不说,由于在这一阶段这个并非咱们研究的范围。