我们可以让指针指向某类变量,并替代该变量在程序中使用;我们也可以让指针指向一维、二维数组或字符数组,来替代这些数组在程序中使用,给我们在编程时带来许多方便。

下面我们定义一种特殊的数组,这类数组存放的全部是指针,分别用于指向某类的变量,以替代这些变量在程序中的使用,增加灵活性。指针数组定义形式:

类型标识*数组名[数组长度]

例如: char *str[4];

由于[ ] 比*优先权高,所以首先是数组形式str[4 ],然后才是与“*”的结合。这样一来指针数组包含4个指针s t r [ 0 ]、s t r [ 1 ]、s t r [ 2 ]、s t r [ 3 ],各自指向字符类型的变量。例如: int *p t r [ 5 ] ;

该指针数组包含5个指针p t r [ 0 ]、p t r [ 1 ]、p t r [ 2 ]、p t r [ 3 ]、p t r [ 4 ],各自指向整型类型的变量。

[例6-22] 针对指针数组的应用,我们分别用指针数组的各指针指向字符串数组、指向一维整型数组、指向二维整型数组。

#include #include m a i n ( )

{

char *ptr1[4]={"china","chengdu","sichuang","chongqin"};

/* 指针数组p t r 1 的4个指针分别依此指向4个字符串* /

int i,*ptr2[3],a[3]={1,2,3},b[3][2]={1,2,3,4,5,6};

for(i=0;i<4;i++)

printf("\n%s",ptr1[i]);/依*此输出ptr1数组4个指针指向的4个字符串*/

printf("\n");

for(i=0;i<3;i++)

ptr2[i]=&a[i];/*将整型一维数组a的3个元素的地址传递给指针数组ptr2*/

for(i=0;i<3;i++)/*依此输出ptr2所指向的3个整型变量的值*/

printf("%4d",*ptr2[i]);

printf("\n");

for(i=0;i<3;i++)

ptr2[i]=b[i];/*传递二维数组b的每行首地址给指针数组的4个指针*/

for(i=0;i<3;i++)/*按行输出*/

printf("%4d%4d\n",*ptr2[i],*ptr2[i]+1);

}

程序中指针数组与所指对象的关系如图6-12所示。

ptr1指针数组中的4个指针分别指向4个字符串,如图6-11的a)所示,程序中依此输出;ptr2指针数组共有3个指针,若将整型一维数组a中各元素地址分别传递给指针数组的各指针,则ptr2[0]就指向a[0];ptr2[1]就指向a[1];ptr2[2]就指向a[2]。若将二维数组各行的首地址分别传递给指针数组的各指针,如图6-11b)所示,这样一来,ptr2[0]就指向了b数组的第0行,该行有两个元素,其地址为ptr2[0]与ptr2[0]+1;相应指针数组第i个元素ptr2[i]指向的b数组的第i行两个元素地址分别为ptr2[i]与ptr[i]+1。

在处理二维字符数组时,我们可以把二维字符数组看成是由多个一维字符数组构成,也就是说看成是多个字符串构成的二维字符数组,或称为字符串数组。

指针数组对于解决这类问题(当然也可以解决问题)提供了更加灵活方便的操作。

有一点需要说明,若定义一个指针数组后,指针数组各元素的取值(即地址)要注意安全性。

如定义指针数组:

char*ptr[3];

我们说该数组包含三个指针,但指针的指向是不确定的,指针现在可能指向内存的任一地址。假定现在作语句:scanf("%s",ptr[i]),则输入的字符串在内存的存放其地址由ptr[i]决定。除非给指针数组元素赋值安全的地址。

[例6-23]定义字符指针数组,包含5个数组元素。同时再定义一个二维字符数组其数组大小为5*10,即5行10列,可存放5个字符串。若将各字符串的首地址传递给指针数组各元素,那么指针数组就成为名副其实的字符串数组。下面对各字符串进行按字典排序。

在字符串的处理函数中,strcmp(str1,str2)函数就可以对两个字符串进行比较,函数的返回值>0、=0、<0分别表示串str1大于str2、str1等于str2、str1小于str2。再利用strcpy()函数实现两个串的复制。下面选用冒泡排序法。

#include#include#includemain()

{

char*ptr1[4],str[4][20],temp[20];

/*定义指针数组、二维字符数组、用于交换的一维字符数组*/

int i,j;

for(i=0;i<4;i++)

gets(str[i]);/*输入4个字符串*/

printf("\n");

for(i=0;i<4;i++)

ptr1[i]=str[i];/*将二维字符数组各行的首地址传递给指针数组的各指针*/

printf("original string:\n");

for(i=0;i<4;i++)/*按行输出原始各字符串*/

printf("%s\n",ptr1[i]);

printf("ordinal string:\n");

for(i=0;i<3;i++)/*冒泡排序*/

for(j=0;j<4-i-1;j++)

if(strcmp(ptr1[j],ptr1[j+1])>0)

{strcpy(temp,ptr1[j]);

strcpy(ptr1[j],ptr1[j+1]);

strcpy(ptr1[j+1],temp);

}

for(i=0;i<4;i++)/*输出排序后的字符串*/

printf("%s\n",ptr1[i]);

}

程序中一定要注意指针的正确使用。一旦将二维字符数组的各行首地址传递给指针数组的各指针,则相当于给指针分配了安全可操作的地址,地址空间大小由二维字符数组来决定。

当然也可由编译系统为指针分配地址用于字符串的存放。

[例6-24]利用malloc()函数为指针分配存储空间,实现字符串的排序。

#include#include#includemain()

{

char *ptr1[4],*temp;

inti,j;

for(i=0;i<4;i++)

{

ptr1[i]=malloc(20);/*为指针数组各指针分配20字节的存储空间*/

gets(ptr1[i]);

}

printf("\n");

printf("original string:\n");

for(i=0;i<4;i++)

printf("%s\n",ptr1[i]);

printf("ordinal string:\n");

for(i=0;i<3;i++)

for(j=0;j<4-i-1;j++)

if(strcmp(ptr1[j],ptr1[j+1])>0)

{

temp=ptr1[j];/*利用指向字符串的指针,进行指针地址的交换*/

ptr1[j]=ptr1[j+1];

ptr1[j+1]=temp;

}

for(i=0;i<4;i++)/*字符串输出*/

printf("%s\n",ptr1[i]);

}

运行程序,其结果与上述例6-23完全相同

[例6-25]对已排好序的字符指针数组进行指定字符串的查找。字符串按字典顺序排列,查找算法采用二分法,或称为折半查找。

折半查找算法描述:

1.设按开序(或降序)输入n个字符串到一个指针数组。

2.设low指向指针数组的低端,high指向指针数组的高端,mid=(low+high)/2

3.测试mid所指的字符串,是否为要找的字符串。

4.若按字典顺序,mid所指的字符串大于要查找的串,表示被查字符串在low和mid之间,否则,表示被查字符串在mid和high之间。

5.修改low式high的值,重新计算mid,继续寻找。

#include#include#include#includemain()

{

char*binary();/*函数声明*/

char*ptr1[5],*temp;

inti,j;

for(i=0;i<5;i++)

{

ptr1[i]=malloc(20);/*按字典顺序输入字符串*/

gets(ptr1[i]);

}

printf("\n");

printf("original string:\n");

for(i=0;i<5;i++)

printf("%s\n",ptr1[i]);

printf("input search string:\n");

temp=malloc(20);

gets(temp);/输*入被查找字符串*/

i=5;

temp=binary(ptr1,temp,i);/*调用查找函数*/

if(temp)printf("succesful-----%s\n",temp);

elseprintf("nosuccesful!\n");

return;

}

char *binary(char *ptr[],char *str,int n)定义返回字符指针的函数*/

{/*折半查找*/

int hig,low,mid;

low=0;

hig=n-1;

while(low<=hig)

{

mid=(low+hig)/2;

if(strcmp(str,ptr[mid])<0)

hig=mid-1;

elseif(strcmp(str,ptr[mid])>0)

low=mid+1;

else return(str);/*查帐成功,返回被查字符串*/

}

return NULL; / *查找失败,返回空指针* /

}

[例6-26] 在一个已排好序的字符串数组中,插入一个键盘输入的字符串,使其继续保持有序。

在上述程序查找成功的基础上,我们将该字符串插入到字符数组中。插入的位置可以是数组头、中间或数组尾。查找的算法采用折半算法,找到插入位置后,将字符串插入。

#include #include #include #include m a i n ( )

{

int binary(); / *查找函数声明* /

void insert(); / *插入函数声明* /

char *temp,*ptr1[6];

int i,j;

for (i=0;i<5;i++)

{

ptr1[i]=malloc(20);/*为指针分配地址后*/

gets(ptr1[i]);/*输入字符串*/

}

ptr1[5]=malloc(20);

printf("\n");

printf("original string:\n");

for(i=0;i<5;i++)/*输出指针数组各字符串*/

printf("%s\n",ptr1[i]);

printf("input search string:\n");

temp=malloc(20);

gets(temp);/*输入被插字符串*/

i=binary(ptr1,temp,5)/*;寻找插入位置i*/

printf("i=%d\n",i);

insert(ptr1,temp,5,i);/*在插入位置i处插入字符串*/

printf("outputstrings:\n");

for(i=0;i<6;i++)/*输出指针数组的全部字符串*/

printf("%s\n",ptr1[i]);

return;

}

int binary(char*ptr[],char*str,intn)

{/*折半查找插入位置*/

int hig,low,mid;

low=0;

hig=n-1;

if(strcmp(str,ptr[0])<0)return0;

/*若插入字符串比字符串数组的第0个小,则插入位置为0*/

if(strcmp(str,ptr[hig])>0)returnn;

/*若插入字符串比字符串数组的最后一个大,则应插入字符串数组的尾部*/

while(low<=hig)

{

mid=(low+hig)/2;

if(strcmp(str,ptr[mid])<0)

hig=mid-1;

else if(strcmp(str,ptr[mid])>0)

low=mid+1;

else return(mid);/*插入字符串与字符串数组的某个字符串相同*/

}

return low;/*插入的位置在字符串数组中间*/

}

void insert(char*ptr[],char*str,intn,inti)

{

int j;

for(j=n;j>i;j--)/*将插入位置之后的字符串后移*/

strcpy(ptr[j],ptr[j-1]);

strcpy(ptr[i],str);将被插字符串按字典顺序插入字符串数组*/

}

在程序中,字符串数组的6个指针均分配存放20字节的有效地址。语句ptr1[5]=malloc(20)保证插入字符串后,也具有安全的存储空间,字符串的长度以串中最长的为基准向系统申请存储空间,以保证在串的移动中有足够的存储空间。

c语言数组转指针,(转)c语言指针数组相关推荐

  1. 【C 语言】结构体相关 的 函数 指针 数组

    . 作者 : 万境绝尘 转载请注明出处 : http://www.hanshuliang.com/?post=30 . 结构体概述 : 结构体是 多个 变量的集合, 变量的类型可以不同; -- 可进行 ...

  2. c语言数组数据用指针查找,c语言数组与指针_指针篇_2011.ppt

    c语言数组与指针_指针篇_2011 指 针 6.2 指针的概念6.3 指针与数组6.4 字符串的指针6.5 指针数组和指向指针的指针;6.2.1 地址与指针的概念 ;指针的概念;内存地址;2.数组与地 ...

  3. C语言程序设计 | 指针(二):常量指针和指针常量、数组参数和指针参数、函数指针数组

    指针的进阶(二)目录: 常量指针和指针常量 数组参数和指针参数 函数指针数组 常量指针和指针常量 在我们日常中,经常会用到一个关键字const const是一个C语言(ANSI C)的关键字,具有着举 ...

  4. c语言 地址+1,C语言中,为什么指针表达式的值+1.对应的地址值却+4?/为什么两个数组元素的地址相减之差不为地址之差?...

    在C语言中,我们常常用到的一个运算是让某个变量的值+1. 例如 M = M + 1. 而在实际运用中,我们发现 对于指针进行+1运算,算出来的结果是+4. 如下图 图中我们定义的 变量M 和指针Mat ...

  5. c语言形参指针 实参数组,《C语言程序设计》中的指针形参和函数体中数组实参问题的教学研究.pdf...

    <C语言程序设计>中的指针形参和函数体中数组实参问题的教学研究.pdf C C <CC语言程序设计>中的指针形参和函数体中数组实参问题的教学研究 山东理工大学计算机学院 董敬富 ...

  6. java char指针数组_简单总结C语言中各种类型的指针的概念

    C语言中有很多关于指针的使用,指针也是C语言的灵魂所在,而且C语言中也有很多有关指针的概念,这里学习并总结了一些知道的概念. 常量指针:首先它是一个指针,常量只是用来修饰指针的定语.其定义如下: ch ...

  7. 【C语言进阶深度学习记录】三十一 数组作为函数参数时退化为指针

    之前的学习数组的文章中,已经知道一维数组作为函数参数的时候,最终会被编译器编译为指针.今天来看看二维数组的情形 文章目录 1 为什么C语言中的数组作为函数参数会退化为指针? 2 二维数组作为函数参数如 ...

  8. C语言 指针数组和数组指针区别 - C语言零基础入门教程

    目录 一.简介 1.数组 2.指针 3.指针和数组区别 二.指针数组和数组指针区别 1.指针数组 2.数组指针 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> ...

  9. c语言数组宏定义标识符,C语言学习笔记--预编译/宏定义/数组/参数传递/函数指针...

    目录 预编译 值传递.指针传递.引用传递 数组 typedef 函数指针 预编译 预编译又叫预处理.预编译不是编译,而是编译前的处理.这个操作是在正式编译之前由系统自动完成的.#define 和 #i ...

  10. 数组c语言与指针,浅析C语言数组与指针

    摘 要:数组和指针是C语言的两个最重要的概念,它们若结合起来使用,非常灵活,初学者往往感到无所适从,笔者根据多年的经验,利用典型实例和图表对指向一维数组的指针的定义和数组元素的引用.指针与自增自减运算 ...

最新文章

  1. 钢铁侠“变身”AI布道师?小罗伯特·唐尼这次推出一部AI科普纪录片
  2. JAVA必备——13个核心规范
  3. chrome扩展推荐:有我,你又省了一个ssh客户端 --- Secure Shell
  4. 人造神经元成功操纵植物,让捕蝇草强行闭合,脑机接口新思路打开丨Nature子刊...
  5. asp.net panel 加html,ASP.NET 页面中动态增加的控件、添加事件
  6. 成语json_cocos creator实战(2)成语小秀才ts版
  7. 功能强大的被动开源情报自动化侦察框架
  8. [TPYBoard - Micropython之会python就能做硬件 7] 学习使用蓝牙模块及舵机
  9. linux 用户权限 数字,几个linux命令之用户权限相关命令
  10. mysql 数据库的 导入于导出
  11. python可以写前端吗_哪种ide能同时写java和前端代码?
  12. C语言函数指针简单应用
  13. 5.企业安全建设指南(金融行业安全架构与技术实践) --- 安全团队建设
  14. html获取视频时长,js获取本地视频时间长度
  15. 为什么 fac_us=SystemCoreClock/8000000?
  16. Java 的 VO类
  17. 如何使用AndriodStudio制作音乐播放器音乐列表界面和导入手机音乐资源
  18. 二叉树基础题(六):树的子结构二叉搜索树的判断镜像二叉树
  19. 球形罩铆接机械臂设计(lunwen+开题报告+指导记录+设计图纸+PLC控制程序)
  20. 所有平台emoji表情查询网站,记录一下

热门文章

  1. EXTJS学习笔记:grid之分组实现groupingview
  2. AutoCAD打印设置
  3. aGlass 2 绘出射线的交点并用红色小球显示
  4. Atitit 数据建模的技术总结 目录 1. 数据建模 1 2. 常见建模技术 2 2.1. 电子表格程序 计算机辅助设计 (CAD)  2 2.2. Er图 2 3. 建模方法 2 3.1. .
  5. Atitit httpclient 概述  rest接口
  6. Atitit 数据结构与常见文件元数据结构 目录 1. 分类 内部数据结构与外部存储数据结构 1 2. 编程语言内部数据结构 (堆栈 树 图等 1 2.1. 数据结构 (集合,列表,tree,map
  7. Atitit 签名规范 attilax总结 安全签名规范 v2 r99.docx
  8. Atiitt 经济学体系树与知识点概念大总结attilax
  9. Atitit.增强系统稳定性----虚拟内存的设置
  10. Atitit.木马病毒的免杀原理---sikuli 的使用