1--首先通过这个例子领悟一下二级指针
可以看到二级指针pp指向了一级指针p,所以*pp----二级指针的”值“就是p的地址,如果再*(*pp)就相当于*(p)也就是i的值。
#include <stdio.h>
int main() {
int i=10;
int *p=&i;
int **pp=&p;
printf("%p\n",&i);
printf("%p\n",*pp);
printf("i=%d\n",i);
printf("**pp=%d\n",**pp);
}
000000000062FE14
000000000062FE14
i=10
**pp=10
--------------------------------
Process exited after 0.1006 seconds with return value 0
请按任意键继续. . .
2--接下来看指针数组
顾名思义就是一个一维数组,但是里面每一个数组元素存的都是指针,所以叫指针数组。
(为啥前面是char?char就是说里面的数组元素比如pStr[0]应该指向一个字符类型的变量即字符或者字符串)
(要注意缓冲区的问题,gets好像是从缓冲区读取一段字符,这段知识确实有点混,当遇到连续的读字符或者字符串或者读过普通变量再读字符或者字符串记得清空缓冲区)---用getchar()或者新学的的这个表示读一段东西但不赋给任何变量, 还是真奇特为啥会有清空缓冲区的作用?
#include <stdio.h>
int main() {
char x;
char s[20];
scanf("%c%*c",&x);
gets(s);
char* pstr[20];
pstr[0]=&x;
pstr[1]=s;
printf("%c\n",*pstr[0]);
printf("%s",pstr[1]);
}
a
zxczcz
a
zxczcz
--------------------------------
Process exited after 1.635 seconds with return value 0
请按任意键继续. . .
接下来看这个上一篇提到的问题。
#include <stdio.h>
#include <string.h>
#define n 5
void sort(char name[n][2*n]);
int main() {
int i,j;
char name[n][2*n];
for (i=0;i<n;i++)
{
scanf("%s",name[i]);
}
sort(name);
printf("\n\n");
for (i=0;i<n;i++)
{
puts(name[i]);
}
}
void sort(char name[n][2*n])
{
int i,j;
char s[20];
for (i=0;i<n;i++)
{
for (j=0;j<n-i-1;j++)
{
if (strcmp(name[j],name[j+1])>0)
{
strcpy(s,name[j]);
strcpy(name[j],name[j+1]);
strcpy(name[j+1],s);
}
}
}
}
这是上一篇中给出的答案。
现在如果我们借用指针数组呢?其实最大的问题就是如何将指针数组传参进函数,观察字符数组的形式例如char *p[20],我们知道数组传参的时候是可以和指针等价的,像传(a[10])传参时等价于(*a)-----所以!!char *p[20]传参时就等价于char **p。
答案如下。
#include <stdio.h>
#include <string.h>
#define n 5
void input(char **p);
void sort(char **p);
int main() {
int i,j;
char name[n][2*n];
char* pstr[20];
for (i=0;i<n;i++)
{
pstr[i]=name[i];
}
input(pstr);
sort(pstr);
printf("\n\n");
for (i=0;i<n;i++)
{
puts(name[i]);
}
}
void sort(char **p)
{
int i,j;
char *s;
for (i=0;i<n;i++)
{
for (j=0;j<n-i-1;j++)
{
if (strcmp(p[j],p[j+1])>0)
{
strcpy(s,p[j]);
strcpy(p[j],p[j+1]);
strcpy(p[j+1],s);
}
}
}
}
void input(char **p)
{
int i;
for (i=0;i<n;i++)
{
scanf("%s",p[i]);
}
}
当然就形如二维数组一样,也可以直接传相同形式的,(最简单粗暴)。
#include <stdio.h>
#include <string.h>
#define n 5
void input(char *p[20]);
void sort(char *p[20]);
int main() {
int i,j;
char name[n][2*n];
char* pstr[20];
for (i=0;i<n;i++)
{
pstr[i]=name[i];
}
input(pstr);
sort(pstr);
printf("\n\n");
for (i=0;i<n;i++)
{
puts(name[i]);
}
}
void sort(char *p[20])
{
int i,j;
char *s;
for (i=0;i<n;i++)
{
for (j=0;j<n-i-1;j++)
{
if (strcmp(p[j],p[j+1])>0)
{
strcpy(s,p[j]);
strcpy(p[j],p[j+1]);
strcpy(p[j+1],s);
}
}
}
}
void input(char *p[20])
{
int i;
for (i=0;i<n;i++)
{
scanf("%s",p[i]);
}
}
指针可真是奇妙--终于弄懂了,,,