当前位置: 首页 > news >正文

C语言指针易错点—字符数组与字符指针

C语言指针易错点—字符数组与字符指针

  • 字符数组与字符指针的区别
  • 字符数组与字符指针的区别举例
  • 字符指针必须先赋值,后引用

字符数组与字符指针的区别

因为字符数组与字符指针都可以表示字符串,但他们不是等价的。下面就来讲讲他们的区别。

char sa[ ] = "This is a string";
char *sp = "This is a string";

二者都是用字符串"This is a string"来初始化,第一个定义创建字符数组sa,它的元素依次是:‘T’ ‘h’ ‘i’ …

第二个定义创建一个指针变量sp指向 常量区字符串 “This is a string”


对于字符数组sa,系统首先为数组分配足够的内存空间,然后将"This is a string"里面的字符逐个存入数组,并加字符串结束符号’\0’

在这里插入图片描述
这就相当于 char sa[]= {'T','h',........,'\0'}这样

如果要改变数组sa所代表的字符串,只能改变数组元素的内容,如sa[0]=‘t’;
不能修改数组名以及赋值,它是常量

 

对于字符指针sp来说,这就相当于一个指针变量指向一个字符串常量 “This is a string” 的 首地址

在这里插入图片描述

如果要改变指针sp所代表的字符串,只能改变指针的值,让它指向新的字符串,不能改变其元素,如sp[0]=‘t’;非法内存访问。字符串常量”This is a string"不允许修改。

就是说字符串是常量,不能修改里面元素,可以改变指针的指向改变内容,或者使用字符串函数strcpy等


 

字符数组与字符指针的区别举例

char sa[ ] = “This is a string”;
char *sp = “This is a string”;

  • 问题1:把sa和sp中的‘T’变为’t’
    sa[0]=‘t’; //合法
    sp[0] = ‘t’; //非法内存访问。字符串常量不允许被修改
    应该用:char *sp=“this is a string”;

  • 问题2: 把字符串sa和sp的内容改为: “Hello”
    sp=“Hello”;
    sa=“Hello” // 非法,数组名是常量,不能对它赋值
    应该用:strcpy(sa,“Hello”);


 

字符指针必须先赋值,后引用

定义字符指针后,如果没有赋值,指针的值不确定,会很危险,会造成非法内存访问,形成 野指针

例如:

char *s;
scanf("%s",s); //非法内存使用

所以字符指针变量常用的方法是

  1. 指向已经存在的字符数组首地址。
  2. 指向一个动态分配的内存块

扩展练习: 判断实数相同

http://www.lryc.cn/news/21433.html

相关文章:

  • Yolov3,v4,v5区别
  • 基于Appium+WinAppDriver+Python的winUI3应用的自动化框架搭建分享(一)环境配置
  • 使用docker安装RocketMQ
  • 【FPGA仿真】Matlab生成二进制、十六进制的txt数据以及Vivado读取二进制、十六进制数据并将结果以txt格式保存
  • 【第四章 IOC操作bean管理(基于注解方式创建对象,注入属性),完全注解开发】
  • 【手把手一起学习】(六) Altium Designer 20 STM32核心板Demo----PCB设计
  • 【蓝桥杯集训·周赛】AcWing 第92场周赛
  • 编程参考 - GCC中的Basic ASM
  • 软考中级-操作系统
  • MYD-Y6ULL开发笔记
  • 三天吃透Java虚拟机面试八股文
  • Spring Cloud Alibaba全家桶(二)——微服务组件Nacos注册中心
  • 命令执行漏洞 | iwebsec
  • 2023.02.26 学习周报
  • 局域网实现PC、Pad、Android互联
  • AC自动机
  • git入门
  • RK3568编译Android11和目录讲解
  • java泛型学习篇(二)
  • Java基础
  • 骨骼控制(一)——动画动态节点(AnimDynamics)
  • Linux系统下搭建maven环境
  • English Learning - L2 语音作业打卡 Day3 2023.2.23 周四
  • RK3568平台开发系列讲解(驱动基础篇)GIC v3中断控制器
  • 决策树、随机森林、极端随机树(ERT)
  • 软件测试之因果图法
  • vue中子组件间接修改父组件传递过来的值
  • Java I/O
  • pytorch学习日记之图片的简单卷积、池化
  • 【java基础】抽象类和抽象方法