遗漏掉的关于字符串,指针以及数组的一些知识(5) (指针数组和多级指针)

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]);
	}
}

 指针可真是奇妙--终于弄懂了,,, 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值