指针数组

在这里插入图片描述

1.定义(什么是指针数组):

在C语言和C++语言中,数组元素全为指针的数组称为指针数组。
一维指针数组的定义形式为:“类型名 *数组标识符[数组长度]”。
例如,一个一维指针数组的定义:int *ptr_array[10]。

与数组指针关系(对比):
指针数组是数组元素为指针的数组,其本质为数组。
································································································
数组指针是指向数组首元素的地址的指针,其本质为指针(这个指针存放的是数组首地址的地址,相当于2级指针,这个指针不可移动); 
································································································
数组指针,是指定义为指向某个固定大小顺序空间的指针,定义的格式如下:
char (*pa)[10]; //定义一个指向拥有10元素的字符数组的指针,
int (*p)[10]; )

链接:数组指针和指针数组

2.指针数组的创建:

如何向指针数组输入字符串?
1、指针要么是在初始化的时候进行赋值,如:char *p = “hello world!” 或 char *p[3]={“aa”,“abc”,“ggdd”};
2、要么初始化时申请空间,在之后将指针指向一个已经初始化的内存空间;
因为只定义而未初始化的指针不会指向任何内存空间,是不能对指针指向的地方进行赋值的。这就是为什么如果只定义了指针,而为初始化时要使用Xalloc或者new来申请空间

1、在初始化的时候进行赋值(代码实现如下:)

#include<stdio.h>
int main()
{
    int i;
    char *pch[6] = {"abc","bee","ca","d","e","f"};
    for(i=0; i<6; i++)
    {
        printf("%s ",pch[i]);
    }
    printf("\n");
    return 0;
}

2、申请空间

  • 使用malloc函数为指针数组分配空间:

malloc是动态随机分配内存空间的方法,可以根据需要分配内存空间给程序使用。
如:(char*)malloc(sizeof(char)*20)
的意思是动态分配空间为20个char型数据大小的空间,并且将返回的指针类型强制转换成char型指针。

开设空间的操作可以应用循环语句进行,例如:对于char *p[10]; 可以应用

for( i=0 ; i<10 ; i++ ) {
p[i] = ( char *) malloc ( sizeof ( char ) * N ); //为每个指针申请开设N字符的存储空间
}

开设后,对于p的使用与二维数组的使用格式类似,可以有效的使用两个下标,如 p[0][0]=‘A’;
还可以向每个指针中赋值字符串: p[2]=“Beijing”; 当然字符串长度应该小于N。(此时可输出p[2][0]=B,p[2][1]=e, p[2][3]=i,等等)

代码实现如下:

#include<bits/stdc++.h>
using namespace std;
int main ()
{
    int i;
    char *ptr[3];//按目前的声明,ptr是一个指针数组,其中的元素其实都是野指针,并没有指向合法可用的内存,因此在cin语句之前要动态分配内存,并将指针指向新分配的内存
    for(i = 0 ; i <= 2 ; i++)
    ///ptr[i] = "hello!"; 重新指向
    {
        ptr[i] = (char *)malloc(100*sizeof(char)); ///申请空间,与上面的重新指向区别
        cin>>ptr[i];
    }
    for(i = 0; i <= 2 ; i++)
        cout <<ptr[i] << endl;
    return 0 ;
}

C代码实现如下:

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    char *str[5] = {}; ///5为5个字符串,后面的大括号为初始化
    int i;
    for(i=0;i<5;i++)
    {///指针数组如果没有初始化赋值,则要申请空间,切记,否则会出错,这里的100为每个字符串的元素个数最多为100
        str[i] = (char *)malloc(100);
    }
    for(i=0;i<5;i++)
    {
        scanf("%s",str[i]); ///这里不用加& ,因为str本身是地址
    }
    for(i=0;i<5;i++)
    {
        printf("%s  ",str[i]);
    }
    printf("\n");
    for(i=0;i<5;i++)
    {
        free(str[i]);///最后要free,逐个free
    }
    return 0;
}

C代码运行结果如下:
在这里插入图片描述
题目代码实现如下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    int n,i;
    scanf("%d",&n);
    char *color[105],*aa;
    aa=(char *)malloc(101*sizeof(char));
    for(i=0;i<n;i++){
        color[i]=(char *)malloc(101*sizeof(char));
    }
    for(i=0;i<n;i++){
        scanf("%s",color[i]);
    }
    for(int q=0;q<n;q++){
        int k=q;
        for(int w=q+1;w<n;w++){
            int t=strcmp(color[k],color[w]);
                if(t>0){
                        k=w;
                }
            }
        printf("%s\n",color[k]);
        strcpy(aa,color[q]);
        strcpy(color[q],color[k]);
        strcpy(color[k],aa);
    }
    for(i=0;i<n;i++){
        free(color[i]);
    }
    free(aa);
    return 0;
}

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值