游戏筑基开发之字符串、字符指针、字符数组的相关知识梳理(C语言)
游戏筑基开发之字符串、字符指针、字符数组的相关知识梳理(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.对字符串常量、字符指针、字符串常量知识的整理概述
- 以字符串形式出现的,编译器都会对该字符串末尾加上\0或者\000作为结束符,如在代码中“abc”,那么编译器存储的时候便是“abc\0”。
- “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语言)相关推荐
- C语言程序设计 | 指针的进阶(一):字符指针、数组指针、指针数组、函数指针
指针的进阶(一)目录: 字符指针 数组指针和指针数组 函数指针 字符指针 在开始讲解这一章节之前,我们需要了解指针前面声明的类型的意义 类型 * 指针名 对于指针来说,我们在给指针进行声明时,我们声明 ...
- (C语言)指针进阶(1)——字符指针、数组指针
初识指针结束啦,从本期开始,正式进入指针进阶部分. 目录 一.字符指针 二.数组指针 回顾关于数组名的理解 一.字符指针 在指针的类型中,我们知道有一种指针类型为字符指针char* 思考以下代码的输出 ...
- 字符串与指针,数组的关系与用途
1.对于字符串可以由字符数组来存储 例如: char a[]="hello" 2.字符串用指针来表示 char *p="hello"; 这只能代表字符串的首地址 ...
- 指针的指针、字符串和指针、数组指针(详)
一.指针的指针 指针的指针,即指针的地址 定义了一个指针变量,指针变量本身占4个字节,指针变量也有地址编号 例: int a=0x12345678; 假设a的地址为:0x0000 2000 int * ...
- 字符串在指针和数组上赋值的区别
1 #include<stdio.h> 2 int main() 3 { 4 char *str1 = "abcde";// 字符串常量 5 ch ...
- Linux 字符设备驱动结构(三)—— file、inode结构体及chardevs数组等相关知识解析
前面我们学习了字符设备结构体cdev Linux 字符设备驱动开发 (一)-- 字符设备驱动结构(上) 下面继续学习字符设备另外几个重要的数据结构. 先看下面这张图,这是Linux 中虚拟文件系统. ...
- 22. 一个题来探查对 字符串,指针,数组三方面的关联使用方面的概念是否清晰,分析下面三个printf打印什么?...
1 //分析下面三个printf打什么? 2 #include <stdio.h> 3 int main() 4 { 5 6 char *c[] = {"ENTER", ...
- java字符串常量池长度_Java String类相关知识梳理(含字符串常量池(String Pool)知识)...
目录 1. String类是什么 1.1 定义 1.2 类结构 1.3 所在的包 2. String类的底层数据结构 3. 关于 intern() 方法(重点) 3.1 作用 3.2 字符串常量池(S ...
- 第四天2017/03/31(上午:指针、数组的小知识)
1.指针数组的应用场景(用处很小) (1)int main(int argc,char* argv[])//cmd命令行 (2)菜单 2.野指针问题 [概念]指针p指向的内存空间被释放掉,但是p指针的 ...
- Android多媒体开发-stagefright及AwesomePlayer相关知识梳理
android的多媒体框架中, stagefright其实是AwesomePlayer的代理,就是个皮包公司. status_t StagefrightPlayer::setDataSource( c ...
最新文章
- Pycharm中一些不为人知的技巧pycharm技巧
- 依赖注入?依赖注入是如何实现解耦的?
- linux与linux的连接,linux 硬链接与软连接
- 以Attention Model为例谈谈两种研究创新模式
- Extreme 交换机基础配置命令
- laravel-mix 使用
- import提升导致Fundebug报错:“请配置apikey”
- 利用IShellExecuteHook接口对程序监控
- 两组声音的一维数据如何比较相似度_TSNE高维数据降维可视化工具 入门到理解 + python实现...
- asp.net页面调用cs中的方法
- adb命令刷机vivox20_求救VIVO X20的 ROOT可行的方法。
- office表格怎么冻结前两行_「excel冻结前两行」excel2013怎么冻结前两行 - seo实验室...
- [FUNC]ObjRegisterActive
- cURL 详解(附实例)
- 【转】正则表达式高级学习技巧
- 谈谈我的技术专家之路
- Mac 版ps cs6 破解
- 【181101】VC++电子地图绘制工具源代码
- 1 色相、饱和度、明度定义
- android rom指什么,【安卓基础知识】什么是ROM、RAM
热门文章
- 百面机器学习—12.优化算法
- HDFS常用命令/API+上传下载过程(三)
- 入门不简单(《Beginning C# Objects中文版》书评)
- 优化理论08-----约束优化的最优性条件、拉格朗日条件、凸性、约束规范、二阶最优性条件(下)
- collections模块 :namedtuple、deque、defaultdict、OrderedDict、ChainMap、Counter
- 73 ----空间曲线的投影、投影柱面与投影曲线的方程、二元函数的等值线、等高线的性质
- 8.5 意境级讲解迁移学习
- 一、optimizer_trace介绍
- android 呼吸灯权限_Android 呼吸灯效果
- Flutter学习 — 设计基础