用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈,主要有以下几点。

(1)字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第1个字符的地址),绝不是将字符串放到字符指针变量中。

(2)赋值方式。可以对字符指针变量赋值,但不能对数组名赋值。

可以采用下面方法对字符指针变量赋值:

char * a;          //a为字符指针变量
a="I love China!"; //将字符串首元素地址赋给指针变量,合法。但赋给a的不是字符串,而是字符串第一个元素的地址。

不能用以下办法对字符数组名赋值:

char str[14];
str[0]='I';   //对字符数组元素赋值,合法
str="I love China!";  //数组名是地址,是常量,不能被赋值,非法

(3)初始化的含义。对字符指针变量赋初值:

char * a="I love China!)";  //定义字符指针变量a,并把字符串第一个元素的地址赋给a。

等价于

char * a;   //定义字符指针变量 a
a="I love China!";  //把字符串第一个元素的地址赋给a

而对数组的初始化:

char str[14]="I love China!"; //定义字符数组 str,并把字符串赋给数组中各元素

不等价于

char str[14];   //定义字符数组 str
str[]="I love China!" ;  //企图把宇符串赋给数组中各元素,错误

数组可以在定义时对各元素赋初值,但不能用赋值语句对字符数组中全部元素整体赋值。

(4)存储单元的内容。编译时为字符数组分配若干存储单元,以存放各元素的值,而对字符指针变量,只分配一个存储单元(Visual C++ 为指针变量分配4 个字节)。

如果定义了字符数组,但未对它赋值,这时数组中的元素的值是不可预料的。可以引用(比如输出)这些值,结果显然是无意义的,但不会造成严重的后果,容易发现和改正。

如果定义了字符指针变量,应当及时把一个字符变量(或字符数组元素)的地址赋给它,使它指向一个字符型数据,如果末对它赋予一个地址值,它并未具体指向一个确定的对象。

此时如果向该指针变量所指向的对象输人数据,可能会出现严重的后果。常有人用下面的方法:

char * a;//定义宇符指针变量 a
scanf(" %s" ‚a) ;  //从键盘输人一个字符串,使a指向该宇符串,这是错误的

在编译时会发出“警告”信息,提醒未给指针变量指定初始值(未指定其指向),虽然也能勉强运行,但这种方法是危险的。因为编译时给指针变量a分配了存储单元,变量a的地址(即 &a)是己指定了,但a并未被赋值,在a的存储单元中是一个不可预料的值。在执行 scanf 两数时,要求将一个字符串输人到a所指向的一段存储单元(即以a的值是一个地址)开始的一段内存单元)中。

而a的值如今却是不可预料的,它可能指向内存中空白的(未用的)用户存储区中(这是好的情况),也有可能指向已存放指令或数据的有用内存段,这就会破坏了程序或有用数据,甚至破坏了系统,会造成严重的后果。应当绝对防止这种情况的出现。应当在定义指针变量后,及时指定其指向。

如:

char * a, strC10];//定义了字符指针变量a和字符数组 str
a=str; //使a指向 str 数组的首元素
scanf("%$”,a);//从键盘输人一个字符串存放到a所指向的一段存储单元中,做法正确

先使a有确定值,使a指向一个数组元素,然后输人一个字符串,把它存放在以该地址开始的若干单元中。

(5)指针变量的值是可以改变的,而字符数组名代表一个固定的值(数组首元素的地址),不能改变。

(6)字行数红中各元素的值是可以改空的(可以对它们再赋值),但字符指针变量指向的宇符串常量中的内容是不可以被取代的(不能对它们再赋值)。

如:

char a[]="House"; //字符数组a初始化
char * b="House"; //字符指针变量b指向字符串常量的第一个字符
a[2]='r': //合法,r取代a数组元素a[2]的原值u
b[2]='r';//非法,字符串常量不能改变

(7)引用数组元素。对字符数组可以用下标法(用数组名和下标)引用一个数组元素(如a[5]),也可以用地址法(如 * (a十5))引用数组元素a[5]。

如果定义了字符指针变量p,并使它指向数组a的首元素,则可以用指针变量带下标的形式引用数组元素(如 p[5]),同样,可以用地址法(如* (p十5))引用数组元素 a[5].

但是,如果指针变量没有指向数组,则无法用 p[5]或 * (p十5) 这样的形式引用数组中的元素。这时若输出 p[5]或* (p+5),系统将输出指针变量p所指的字符后面5个字节的内容。显然这是没有意义的,应当避免出现这种情况。

若宇符指针变量口指向字符串常量,就可以用指针变量带下标的形式引用所指的字符串中的字符。

如:

char * a="I love China !";//定义指针变量a,指向字符串常量

则a[5]的值是a所指向的宇符串”I love China!”中第6个字符(序号为 5),即字母'e'。

虽然并未定义数组a,但字行串在内存中是以字符数组形式存放的。

a[5]按 * (a+5)处理,即从a 当前所指向的元素下移 5 个元素位置,取出其单元中的值。

(8)用指针变量指向一个格式宇行串,可以用它代替printt 函数中的格式宇符串。

例如:

char * format;
format="a=%d,b=%f\n";  //使format指向一个字符串
printf(format,a,b);

它相当于:

printf'a=%d,b=%f\n”,a,b);

因此只要改变指针变量 format 所指向的字符串,就可以改变输入输出的格式。这种 printf函数称为可变格式输出函数。

也可以用字符数组实现。例如:

char format[]="a=%d,b=%f\n";
printf(format,a,b);

但使用字符数组时,只能采用在定义数组时初始化或逐个对元素赋值的方法,而不能用赋值语句对数组整体赋值,如:

char format[];
format="a=%d,b=%d\n";    //非法 

因此,用指针变量指向字符串的方式更为方便。

字符指针变量和字符数组的比较相关推荐

  1. 指针系统学习5-对使用字符指针变量和字符数组的讨论

    虽然用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈-- 主要概括起来有以下几点: 1. 字符数组由若干个元素组成,每个元素中  放一个字符,而字符指针变量中 ...

  2. 字符指针变量和字符数组的对比

    使用字符数组和指针变量都能实现字符串的存储和运算,但它们两者之间是有区别的,不应混为一谈,主要有一下几点: (1)字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串中 ...

  3. 对使用字符指针变量和字符数组的讨论

    区别:1.字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第一个字符的地址). 2.赋值方式.对字符数组只能对各个元素赋值,不能用以下方法对字符数组赋值:char ...

  4. (转)字符型指针变量与字符数组的区别

    (1)分配内存 设有定义字符型指针变量与字符数组的语句如下: char *pc ,str[100]; 则系统将为字符数组str分配100个字节的内存单元,用于存放100个字符.而系统只为指针变量pc分 ...

  5. 第十节 字符串指针变量与字符数组的区别(十一)

    用字符数组和字符指针变量都可实现字符串的存储和运算.但是两者是有区别的.在使用时应注意以下几个问题: 1) 字符串指针变量本身是一个变量,用于存放字符串的首地址.而字符串本身是存放在以该首地址为首的一 ...

  6. 2020-11-30(为什么字符串可以赋值给字符指针变量)

    今天带着疑问去看了看字符指针,就一直在想为什么输出一个指向字符的指针,它输出的不是地址,而是字符,结果挖到了一个宝藏博客,然后结合了自身的想法,摘抄了大部分内容,最后我也把我自己的疑问给解决了,外加再 ...

  7. 为什么字符串可以赋值给字符指针变量

    本文系转载,对原文的主要几点进行了提炼,想看更详细的内容,请看原帖: https://blog.csdn.net/yichu5074/article/details/81701850?utm_sour ...

  8. C语言指针变量与一维数组

    数组元素之间的地址是相连的: 变量地址绝对不是相连的,如果找到规律那也只是一个偶然的,不是必然的: 1. 指针变量和一位数组 下面对指针数组进行分析,index(小标是从0开始),array数组是in ...

  9. c语言中字符指针变量输入,C语言指针基础知识实例讲解

    对程序进行编译的时候,系统会把变量分配在内存单位中,根据不同的变量类型,分配不同的字节大小.比如int整型变量分配4个字节,char字符型变量分配1个字节等等.被分配在内存的变量,可以通过地址去找到, ...

最新文章

  1. Spring原理总结
  2. Java Web整合开发(17) -- Struts 2.x 高级应用
  3. VB100八月测试:Vista成众安全厂商梦魇 国内仅可牛通过测试
  4. SharePoint 服务器端对象模型操作文档库(上传/授权/查看权限)
  5. 24点游戏java_Java实现24点小游戏
  6. python自动化pdf报告_[Python] 自动化办公 PDF提取文字、表格、图片
  7. 去月球“你知道戴维会变身成哪种动物吗?”
  8. nyoj116士兵杀死(两)段树单点更新
  9. linux分区问题,调整linux分区问题
  10. 2015年上海现场赛重现 (A几何, K暴力搜索)
  11. Selenium2Library(RF)浏览器打不开问题汇总
  12. java 字符串排序_Java控制台输入字符串及字符串比较
  13. 送书 |《Python大数据与机器学习实战》
  14. 时间管理之-----《暗时间》-刘未鹏
  15. uniapp换行符号_第15讲 : uni-app 组件 - 地图组件
  16. avcap 跨平台摄像头视频捕捉
  17. 人民币转换美金的c语言代码大全,人民币和美元大写格式在线工具,美元美金数字金额转换大写,外币大写金额...
  18. html本地视频在线播放,html5本地播放器
  19. 字体 跨域访问_21个访问量最大的免费字体网站
  20. iOS home键直接退出

热门文章

  1. 正则表达式截取字符串
  2. 联想刃7000Intel VT-x处于禁用状态
  3. arp_spoof脚本的编写
  4. CelebA-Spoof:具有丰富标注的大规模人脸反欺骗数据集|高清人脸数据集 FFHQ | 下载地址|简记
  5. 运动蓝牙耳机哪个品牌好、最好的五款运动蓝牙耳机品牌排行推荐
  6. php cnblog,cnblog.php
  7. windows查看mysql版本(三种方法)
  8. 2021-12-16 《聪明的投资者》学习笔记-13.对四家上市公司的比较--普通了解,不必强求
  9. argb8888格式的jpeg_Android彩色格式(RGB565,ARGB8888)
  10. 电脑便签怎么防止内容被误删