字符指针变量和字符数组的区别

字符指针变量和字符数组的区别

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

区别(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";

等价于

char *a;
a = "I love CHina";

而对数组的初始化:

char str[14] = "I love China";

不等价于

char str[14];
str[] = "I love China";

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

区别(4)

存储单元的内容,编译时为字符数组分配若干存储单元,以存发各元素的值,而对字符指针变量,只分配一个存储单元(Visual C++ 为指针变量分配4个字节)
如 果 定 义 了 字 符 数 组 , 但 未 对 它 赋 值 , 这 时 数 组 中 的 元 素 的 值 是 不 可 预 料 的 。 可 以 引 用 ( 如 输 出 ) 这 些 值 , 结 果 显 然 是 无 意 义 的 , 但 不 会 造 成 严 重 的 后 果 , 容 易 发 现 和 改 正 。 如 果 定 义 了 字 符 指 针 变 量 , 应 当 及 时 把 一 个 字 符 变 量 ( 或 字 符 数 组 元 素 ) 的 地 址 賦 给 它 , 使 它 指 向 一 个 字 符 型 数 据 , 如 果 未 对 它 赋 予 一 个 地 址 值 , 它 并 未 具 体 指 向 一 个 确 定 的 对 象 。 此 时 如 果 向 该 指 针 变 量 所 指 向 的 对 象 输 人 数 据 , 可 能 会 出 现 严 重 的 后 果 。 常 有 人 用 下 面 的 方 法 :

Char *a ; / / 定 义 字 符 指 针 变 量
 scanf("%s",a) / / 企 图 从 键盘 盘 输 人 一 个 字 符 串 , 使 指 向 该 字 符 串 , 错 误 

`在 C + + 中 编 译 时 会 发 出 “ 警 告 ” 信 息 , 提 醒 未 给 指 针 变 量 指 定 初 始 值 ( 未 指 定 其 指 向 ) , 虽 然 也 能 勉 强 运 行 , 但 这 种 方 法 是 危 险 的 。 因 为 编 译 时 给 指 针 变 量 分 配 了 存 储 单 元 , 变 量 a 的 地 址 ( 即 & a ) 是 已 指 定 了 , 但 并 未 被 赋 值 , 在 a 的 存 储 单 元 中 是 一 个 不 可 预 料 的 值 。 在 执 行 scanf 函 数 时 , 要 求 将 一 个 字 符 串 输 人 到 a 所 指 向 的 一 段 存 储 单 元 ( 即 以 a 的 值 ( 是 一 个 地 址 ) 开 始 的 一 段 内 存 单 元 ) 中 。 而 a 的 值 如 今 却 是 不 可 预 料 的 , 它 可 能 指 向 内 存 中 空 白 的 ( 未 用 的 ) 用 户 存 储 区 中 ( 这 是 好 的 情 况 ) , 也 有 可 能 指 向 已 存 放 指 令 或 数 据 的 有 用 内 存 段 , 这 就 会 破 坏 了 程 序 或 有 用 数 据 , 甚 至 破 坏 了 系 统 , 会 造 成 严 重 的 后 果 。 应 当 绝 对 防 止 这 种 情 况 的 出 现 。 应 当 在 定 义 指 针 变 量 后 , 及 时 指 定 其 指 向 。 如 :

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

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

区别(5)

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

 include <stdio. h>
  int main({ 
  char a= I love China!" ;
   a = a+ 7/ /改 变 指 针 变 量 的 值 , 即 改 变 指 针 变 量 的 指 向
    printf("%s\n , a ) ; / / 输 出 从 a 指 向 的 字 符 开 始 的 字 符 串
     return 0} 

程 序 分 析 : 指 针 变 量 的 值 是 可 以 变 化 的 。 printf 孓 数 输 出 字 符 串 时 , 从 指 针 变 量 a 当 时 所 指 向 的 元 素 开 始 , 逐 个 输 出 各 个 字 符 , 遇 到 ’ \ 0 ’ 为 止 。 而 数 组 名 虽 然 代 表 地 址 , 但 它 是 常 量 , 它 的 值 是 不 能 改 变 的 。

  下 面 作 法 是 错 误 的 :
   char str[] = {"I love China ! } ;
    str=str+7printf()% str)

区别(6)

字符数组中各元素的值是可以改变的可以对它们再赋值,但字符指针变量指向的字符常量的内容是不可以被取代的不能对它们再赋值。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值