强化理解指针、指针数组和数组指针(从三味书屋到成华大道)

通过本文章的学习,您将学习到:

1.对指针更加深入的理解

2.什么是指针数组

3.什么是数组指针

Here We Go!

上一篇文章:上课笔记-指针(从百草园到三味书屋)

目录

指针数组-字符串排序(不能输入)

思路一:冒泡排序1

思路二:自定义sort函数

数组指针-字符串排序(适用性更强的字符串排序)

写法一:strcpy写法

写法二:由指针数组到数组指针

写法三:自定义sort函数



指针数组-字符串排序(不能输入)

题目:对5个国家名进行排名

思路一:冒泡排序

思路二:自定义sort排序

指针数组的好处:

按照最一般最一般的思路,就是采用普通的排序方式,对字符串逐个比较后通过字符串复制函数 (strmcpy) 交换字符串的位置。

但是这样做会导致程序运行很慢,而且每个字符串的长度不同,不利于操作。

而指针数组很好地解决了这个问题:将这些字符数组的首地址放在以一个指针数组中,需要交换位置的时候,只需要交换首地址。

思路一:冒泡排序1

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
void sort_string(char *name[],int n);
void print(char *name[],int n);

int main()
{
    int n=5;
    char *name[]={"CHINA","AMERICA","AUSTRALIA","FRANCE","GERMAN"};
    sort_string(name,n);
    print(name,n);
    return 0;
}

void sort_string(char *name[],int n)
{
    char *pt;
    int i,j;
    for(i=0;i<n-1;i++)
    {
        for(j=0;j<n-i-1;j++)
        {
            if(strcmp(name[j],name[j+1])>0){ pt=name[j]; name[j]=name[j+1]; name[j+1]=pt; }
        }
    }
}

void print(char *name[],int n)
{
    int i;
    for(i=0;i<n;i++)
            printf("%s\n",name[i]);
}

拓展:用首地址可以输出字符串的解释

思路二:自定义sort函数

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
void sort_string(char *name[],int n);
void print(char *name[],int n);
bool cmp(char *name1,char *name2);

int main()
{
    int n=5;
    char *name[]={"CHINA","AMERICA","AUSTRALIA","FRANCE","GERMAN"};
    sort(name,name+5,cmp);
    print(name,n);
    return 0;
}

void print(char *name[],int n)
{
    int i;
    for(i=0;i<n;i++)
            printf("%s\n",name[i]);
}

bool cmp(char *name1,char *name2)
{
    if(strcmp(name1,name2)>0)
            return name1<name2;
    else return name1>name2;
}

数组指针-字符串排序(适用性更强的字符串排序)

        题目:在主函数中输入5个不等长的字符串。用函数实现对它们按升序排序,并在主函数中输出这5个已排序的字符串。

写法一:strcpy写法

写法二:通过首地址的交换实现排序

写法三:自定义sort函数

写法一:strcpy写法

#include<stdio.h>
#include<string.h>

void fun(char (*p)[100]) {
	char s[100];
	for (int i = 0; i < 5-1; i++)
	{
		for (int j = 0; j < 5-i-1; j++)
		{
			if (strcmp(*(p + j), *(p + j + 1)) > 0)
			{
				strcpy(s, *(p + j +1));
				strcpy(*(p + j +1), *(p + j));
				strcpy(*(p + j), s);
			}
		}
	}
}

int main() {
	char str[5][100], (*p)[100];
	p = str;		
    //输入
	for (int i = 0; i < 5; i++)
	{
		gets(str[i]);
	}
	//处理
	fun(p);
    //输出
	for (int i = 0; i < 5; i++)
	{
		puts(*(p+i));
	}
	return 0;
}

拓展一:puts函数

拓展二:数组指针:int *p[n]和int (*p)[n]的区别

拓展三:strcpy函数

写法二:由指针数组到数组指针

我们想要通过数组指针实现 “指针数组-字符串排序” 中写法一--通过首地址的交换实现排序

目前没有写出来,问题在于:在int a[x][y]里面,我没有想到一个合适的方法交换a[x]的地址

写法三:自定义sort函数

先把语言切换成C++

.....

没写出来

欢迎评论告诉我解决方法!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值