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