字符指针变量和字符数组的比较
用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈,主要有以下几点。
(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"; //非法
因此,用指针变量指向字符串的方式更为方便。
字符指针变量和字符数组的比较相关推荐
- 指针系统学习5-对使用字符指针变量和字符数组的讨论
虽然用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈-- 主要概括起来有以下几点: 1. 字符数组由若干个元素组成,每个元素中 放一个字符,而字符指针变量中 ...
- 字符指针变量和字符数组的对比
使用字符数组和指针变量都能实现字符串的存储和运算,但它们两者之间是有区别的,不应混为一谈,主要有一下几点: (1)字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串中 ...
- 对使用字符指针变量和字符数组的讨论
区别:1.字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第一个字符的地址). 2.赋值方式.对字符数组只能对各个元素赋值,不能用以下方法对字符数组赋值:char ...
- (转)字符型指针变量与字符数组的区别
(1)分配内存 设有定义字符型指针变量与字符数组的语句如下: char *pc ,str[100]; 则系统将为字符数组str分配100个字节的内存单元,用于存放100个字符.而系统只为指针变量pc分 ...
- 第十节 字符串指针变量与字符数组的区别(十一)
用字符数组和字符指针变量都可实现字符串的存储和运算.但是两者是有区别的.在使用时应注意以下几个问题: 1) 字符串指针变量本身是一个变量,用于存放字符串的首地址.而字符串本身是存放在以该首地址为首的一 ...
- 2020-11-30(为什么字符串可以赋值给字符指针变量)
今天带着疑问去看了看字符指针,就一直在想为什么输出一个指向字符的指针,它输出的不是地址,而是字符,结果挖到了一个宝藏博客,然后结合了自身的想法,摘抄了大部分内容,最后我也把我自己的疑问给解决了,外加再 ...
- 为什么字符串可以赋值给字符指针变量
本文系转载,对原文的主要几点进行了提炼,想看更详细的内容,请看原帖: https://blog.csdn.net/yichu5074/article/details/81701850?utm_sour ...
- C语言指针变量与一维数组
数组元素之间的地址是相连的: 变量地址绝对不是相连的,如果找到规律那也只是一个偶然的,不是必然的: 1. 指针变量和一位数组 下面对指针数组进行分析,index(小标是从0开始),array数组是in ...
- c语言中字符指针变量输入,C语言指针基础知识实例讲解
对程序进行编译的时候,系统会把变量分配在内存单位中,根据不同的变量类型,分配不同的字节大小.比如int整型变量分配4个字节,char字符型变量分配1个字节等等.被分配在内存的变量,可以通过地址去找到, ...
最新文章
- Spring原理总结
- Java Web整合开发(17) -- Struts 2.x 高级应用
- VB100八月测试:Vista成众安全厂商梦魇 国内仅可牛通过测试
- SharePoint 服务器端对象模型操作文档库(上传/授权/查看权限)
- 24点游戏java_Java实现24点小游戏
- python自动化pdf报告_[Python] 自动化办公 PDF提取文字、表格、图片
- 去月球“你知道戴维会变身成哪种动物吗?”
- nyoj116士兵杀死(两)段树单点更新
- linux分区问题,调整linux分区问题
- 2015年上海现场赛重现 (A几何, K暴力搜索)
- Selenium2Library(RF)浏览器打不开问题汇总
- java 字符串排序_Java控制台输入字符串及字符串比较
- 送书 |《Python大数据与机器学习实战》
- 时间管理之-----《暗时间》-刘未鹏
- uniapp换行符号_第15讲 : uni-app 组件 - 地图组件
- avcap 跨平台摄像头视频捕捉
- 人民币转换美金的c语言代码大全,人民币和美元大写格式在线工具,美元美金数字金额转换大写,外币大写金额...
- html本地视频在线播放,html5本地播放器
- 字体 跨域访问_21个访问量最大的免费字体网站
- iOS home键直接退出
热门文章
- 正则表达式截取字符串
- 联想刃7000Intel VT-x处于禁用状态
- arp_spoof脚本的编写
- CelebA-Spoof:具有丰富标注的大规模人脸反欺骗数据集|高清人脸数据集 FFHQ | 下载地址|简记
- 运动蓝牙耳机哪个品牌好、最好的五款运动蓝牙耳机品牌排行推荐
- php cnblog,cnblog.php
- windows查看mysql版本(三种方法)
- 2021-12-16 《聪明的投资者》学习笔记-13.对四家上市公司的比较--普通了解,不必强求
- argb8888格式的jpeg_Android彩色格式(RGB565,ARGB8888)
- 电脑便签怎么防止内容被误删