游戏筑基开发之字符串、字符指针、字符数组的相关知识梳理(C语言)

该文章大部分均为转载内容,对其进行梳理【点击跳转】

1.为什么可以将字符串常量赋值给字符指针变量?

char *p,a='5';
p=&a;                     //正确
p="abcd";              //正确

原因如下:
  字符串常量的双引号的作用:
  1. 在常量区申请内存保存该字符串
  2. 在字符串的尾部加上’\0’
  3. 返回该字符串在常量区的地址
即可以将该地址赋值给一个字符指针。

2.为什么字符串常量无法赋值给字符数组?

char *p = “hello”;//正确
char p1[10];
p1 = "hello";//错误
char p2[10] = "hello";//正确

  字符串常量双引号记录的是该字符串常量的地址,并不是字符串常量本身。char p2[10] = “hello”;可以是因为C语言支持该初始化方式。类似于p2[0] = ‘h’,p2[1] = ’e‘…
p1 = “hello”;这样是错误的,因为p1本身就是一个指针,指向大小为10个字节的内存空间,类似于指针常量,其指向无法修改。即无法给指针常量赋值。

TIPS:在void指针使用的时候,不能使用指针运算,应为void型编译器不能识别类型的长度(即指针所指对象的体积),p++这样就是不合法的,即不能进行数学运算,也不能使用*取值操作,想使用必须转换为其它的类型。

3.对字符串常量、字符指针、字符串常量知识的整理概述

  1. 以字符串形式出现的,编译器都会对该字符串末尾加上\0或者\000作为结束符,如在代码中“abc”,那么编译器存储的时候便是“abc\0”。
  2. “abc”一定是常量吗?
    答案是不一定。
    ①不是常量的情况:当“abc”作为字符数组的初始值就不是,如char str[] = “abc”;因为字符数组是将字符一个一个的存放起来,编译器解析为char str[4] = {‘a’,‘b’,‘c’,’\0‘};即如果char str[4]是一个局部变量的话,那么便在栈区上,不是常量。
    ②常量的情况:当“abc”赋值给一个字符指针变量时,如 char* ptr = “abc”;因为我们定义的是一个在栈区的普通字符指针,并没有定义任何内存空间来存放字符串常量“abc”。所以编译器把其存入内存中的常量区。因此即便是我们没有写成const char* ptr = “abc”;但是我们仍然不能操作ptr[0]=‘x’;因为ptr实际上指向的是一个常量,即ptr是一个常量指针,其指向的值不能修改。如果char* ptr = “abc”;写在函数体内,那么虽然这里的"abc\0"被放在常量区中,但是ptr本身只是一个普通的指针变量,所以ptr是被放在栈上的,而其指向在常量区,函数执行完毕ptr的内存空间被释放,即在栈区的内存空间被释放,但是"abc"仍然在常量区,未被释放。
    ③字符串常量的类型可以理解为相应字符常量数组的类型。
    如"abcdef"的类型就可以看成是const char[7]
    ④对于函数参数列表中的以数组类型书写的形式参数,编译器把其解释为普通的指针类型。
    如对于void func(char sa[100],int ia[20],char *p)则sa的类型为char*,ia的类型为int*,p的类型为char*。

4.为什么字符数组可以直接赋值给字符指针?

char a[10] ="hello";
char *p;
p = a;//正确

  char a[10]字符数组就是一个占用10个字节的连续地址空间。其首地址保存在a(指针常量)中。而p = a;就是将a记录的连续地址的首地址告知p,从而p指向的值就是"hello",且其保存了该连续地址的首地址。

游戏筑基开发之字符串、字符指针、字符数组的相关知识梳理(C语言)相关推荐

  1. C语言程序设计 | 指针的进阶(一):字符指针、数组指针、指针数组、函数指针

    指针的进阶(一)目录: 字符指针 数组指针和指针数组 函数指针 字符指针 在开始讲解这一章节之前,我们需要了解指针前面声明的类型的意义 类型 * 指针名 对于指针来说,我们在给指针进行声明时,我们声明 ...

  2. (C语言)指针进阶(1)——字符指针、数组指针

    初识指针结束啦,从本期开始,正式进入指针进阶部分. 目录 一.字符指针 二.数组指针 回顾关于数组名的理解 一.字符指针 在指针的类型中,我们知道有一种指针类型为字符指针char* 思考以下代码的输出 ...

  3. 字符串与指针,数组的关系与用途

    1.对于字符串可以由字符数组来存储 例如: char a[]="hello" 2.字符串用指针来表示 char *p="hello"; 这只能代表字符串的首地址 ...

  4. 指针的指针、字符串和指针、数组指针(详)

    一.指针的指针 指针的指针,即指针的地址 定义了一个指针变量,指针变量本身占4个字节,指针变量也有地址编号 例: int a=0x12345678; 假设a的地址为:0x0000 2000 int * ...

  5. 字符串在指针和数组上赋值的区别

    1  #include<stdio.h> 2  int main() 3  { 4     char *str1 = "abcde";// 字符串常量 5     ch ...

  6. Linux 字符设备驱动结构(三)—— file、inode结构体及chardevs数组等相关知识解析

    前面我们学习了字符设备结构体cdev Linux 字符设备驱动开发 (一)-- 字符设备驱动结构(上)  下面继续学习字符设备另外几个重要的数据结构. 先看下面这张图,这是Linux 中虚拟文件系统. ...

  7. 22. 一个题来探查对 字符串,指针,数组三方面的关联使用方面的概念是否清晰,分析下面三个printf打印什么?...

    1 //分析下面三个printf打什么? 2 #include <stdio.h> 3 int main() 4 { 5 6 char *c[] = {"ENTER", ...

  8. java字符串常量池长度_Java String类相关知识梳理(含字符串常量池(String Pool)知识)...

    目录 1. String类是什么 1.1 定义 1.2 类结构 1.3 所在的包 2. String类的底层数据结构 3. 关于 intern() 方法(重点) 3.1 作用 3.2 字符串常量池(S ...

  9. 第四天2017/03/31(上午:指针、数组的小知识)

    1.指针数组的应用场景(用处很小) (1)int main(int argc,char* argv[])//cmd命令行 (2)菜单 2.野指针问题 [概念]指针p指向的内存空间被释放掉,但是p指针的 ...

  10. Android多媒体开发-stagefright及AwesomePlayer相关知识梳理

    android的多媒体框架中, stagefright其实是AwesomePlayer的代理,就是个皮包公司. status_t StagefrightPlayer::setDataSource( c ...

最新文章

  1. Pycharm中一些不为人知的技巧pycharm技巧
  2. 依赖注入?依赖注入是如何实现解耦的?
  3. linux与linux的连接,linux 硬链接与软连接
  4. 以Attention Model为例谈谈两种研究创新模式
  5. Extreme 交换机基础配置命令
  6. laravel-mix 使用
  7. import提升导致Fundebug报错:“请配置apikey”
  8. 利用IShellExecuteHook接口对程序监控
  9. 两组声音的一维数据如何比较相似度_TSNE高维数据降维可视化工具 入门到理解 + python实现...
  10. asp.net页面调用cs中的方法
  11. adb命令刷机vivox20_求救VIVO X20的 ROOT可行的方法。
  12. office表格怎么冻结前两行_「excel冻结前两行」excel2013怎么冻结前两行 - seo实验室...
  13. [FUNC]ObjRegisterActive
  14. cURL 详解(附实例)
  15. 【转】正则表达式高级学习技巧
  16. 谈谈我的技术专家之路
  17. Mac 版ps cs6 破解
  18. 【181101】VC++电子地图绘制工具源代码
  19. 1 色相、饱和度、明度定义
  20. android rom指什么,【安卓基础知识】什么是ROM、RAM

热门文章

  1. 百面机器学习—12.优化算法
  2. HDFS常用命令/API+上传下载过程(三)
  3. 入门不简单(《Beginning C# Objects中文版》书评)
  4. 优化理论08-----约束优化的最优性条件、拉格朗日条件、凸性、约束规范、二阶最优性条件(下)
  5. collections模块 :namedtuple、deque、defaultdict、OrderedDict、ChainMap、Counter
  6. 73 ----空间曲线的投影、投影柱面与投影曲线的方程、二元函数的等值线、等高线的性质
  7. 8.5 意境级讲解迁移学习
  8. 一、optimizer_trace介绍
  9. android 呼吸灯权限_Android 呼吸灯效果
  10. Flutter学习 — 设计基础