C语言 #字符指针

news2024/12/23 16:13:10

文章目录

前言

一、指针概念简述

二、字符指针

二、字符在内存中的存储

总结


前言

以例子为导向来分析字符指针的中存的是什么,以及常量字符串在内存中是如何存储的。


一、指针概念简述

想要详细地了解指针的概念可以戳此链接(详细的万字讲解):http://t.csdnimg.cn/QL5kk

本文就简单地回顾指针的一些基础知识:

1、指针本身就是地址,内存单元的编号为地址,而地址又称为指针;指针在口语上认为是指针变量、是用来存放地址的变量,每个地址都唯一地标识内存中一块内存空间;

2、指针的大小是固定的4byte\8byte (32位平台或者64位平台)

3、指针是有类型的,其类型不会决定其在内存中占据的空间,而是决定了当解引用此指针变量时有多少字节的访问内存的权限;以及指针变量+、-整数的步长

4、指针的运算

二、字符指针

顾名思义,字符指针就是指针变量指向的对象是字符类型,即指针变量的类型为 char* ;

单个字符的指针创建,代码如下:

#include<stdio.h>

int main()
{
	char ch = 'a';
	char* p = &ch;//此*代表着变量p 为指针变量
	*p = 'b';

	return 0;
}

字符指针可以存放一个字符变量的地址,那么字符串的地址该如何存放呢?

先来看一下整型的例子: 

int a = 10 ;

int b = a + 2;

"a+2" 是一个表达式的话,那么此表达式就一定有自己的值,然后再将此值赋给b ;

注:表达式有两个属性:值属性 和 类型属性

即 "a+2" 的结果为12,那么12就为其值属性;2 为int 类型,变量a 为int 类型,那么 "a+2"此表达式 的类型为int 类型。

eg.char * p = "abcdefg" ;

所以若将字符串"abcdefg"当作表达式,那么将它赋给指针变量p 的是什么呢?在x86环境下,指针p 中只能放大小为4byte 的地址;显然整个字符串在内存中是连续存放的,即不止占用一个内存单元空间,所以整个字符串会有多个地址;那么指针p是存放不下整个字符串的地址‘

字符串"abcdefg"赋给指针p是其首字符 'a '的地址。

而函数printf 的占位符%s 会通过字符串的首字符地址而找到整个字符串;

我们来看一下打印字符串,代码如下:

#include<stdio.h>

int main()
{
	char ch[10] = "abcdefg";
	char* p = "abcdefg";
	char* p1 = ch; //将数组的首元素地址存放起来

	printf("%s\n", "abcdefg");
	printf("%s\n", ch);
	printf("%s\n", p);
	printf("%s\n", p1);

	printf("字符串地址=%p\n", "abcdefg");
	printf("指针p中存放的地址=%p\n", p);
	printf("指针p1中存放的地址=%p\n", p1);

	return 0;
}

代码运行结果如下:

分析:字符串的创建是用字符数组创建的,我们打印字符串一般采用 printf("%s\n", "abcdefg"); 这种方式,或者将字符串存在数组中,然后对此数组进行打印,即printf("%s\n",ch);

这时候你可能就会有疑问了,数组名可以理解为整体的数组也可以理解为其首元素的地址,于是我们就不清楚是printf函数的占位符%s 只要得到字符串的首字符地址就会一直往后访问直到遇到 '\0' ;还是根据的整体字符串"abcdefg"或者整个数组而打印出来整个字符串;

于是我们尝试将数组的首元素地址存放到指针p1中,我们会发现 printf("%s\n", p1);也可以实现打印字符串 "abcdefg" ,那么此时似乎就可以感受到打印字符串只要有其首字符的地址即可;那么将字符串的地址存放到指针p中,指针p中存放的是整个字符串的地址吗?我们知道一个字符在内存中占 1 byte 的空间,而一个内存单元有一个地址,如果是想存放整个字符串的地址,就会存多个地址,但是指针变量在x86环境下只向内存申请了4byte 来存放该地址,所以就无法存放整个字符串的地址;printf("指针p中存放的地址=%p\n", p);的结果看以上代码运行结果,可知p中存放的为一个地址,即字符串首元素的地址;

我们将以上的代码又运行了一次:

我们不难发现,字符串的地址未改变,但是数组首元素的地址改变了;这是因为 "abcdefg" 是一个常量字符串,即不能被修改的字符串;此字符串是存放在内存中的常量区的,在编译期间编译器便指派了地址常量区中的值只能读取而不能修改,所以 当将此存在常量区的字符串的地址存到指针变量中,为以防对此指针变量解引用而对此字符串进行修改,于是应该优化写作: const char* p = "abcdefg";

注:const 修饰指针变量:(eg. char* p = "abcdefg"; )

1、当 const 放在 * 的左边,有两中写法,一是 const  char* p = "abcdefg"; 二是 char const * p = "abcdefg"; 表示 *p即指针p 指向的对象是常变量,也就是说指针p 指向的对象是常变量不可修改;

2、当const 放在* 的右边,写作:char* const p = "abcdefg"; 表示指针变量 p是个常变量即存放在指针p中的地址不可修改;

字符指针有两种的表示形式:

1、char* p = "abcdefg";

2、const char* p = "abcdefg"; \ char const * p = "abcdefg";

二、字符在内存中的存储

我们按照例子来分析:

#include<stdio.h>

int main()
{
	const char* p1 = "abcdef";
	const char* p2 = "abcdef";

	char arr1[] = "abcdef";
	char arr2[] = "abcdef";
	if (p1 == p2)
		printf("p1==p2\n");
	else
		printf("p1!=p2\n");

	if (arr1 == arr2)
		printf("arr1==arr2");
	else
		printf("arr1!=arr2");

	return 0;
}

代码运行结果:

分析:常量字符串 ”abcdef“ 存放在内存中的常量区,常量区只能读取而不能对其进行修改;为什么常量字符串存在常量区?因为既然常量字符串不能被修改,那么这样的常量就没必要存多份,只要有一份,大家谁都不能去修改它;所以常量字符串在内存中存一份便足以够用了;所以指针p1 与指针 p2 中存放的地址相同,即p1==p2;

而当数组创建时会向内存申请相对的大小空间来存放数组中的数据;而数组arr1 和 数组arr2 都会向内存申请空间来存放其数据,而每个内存单元的编号都不相同,所以就会导致不同空间的地址在也不相同;再者,数组名代表着首元素的地址,所以 arr1 ! = arr2 ;

注:常量字符串不需要创建;当你写下此代码:const char* p1 = "abcdef"; 的时候,编译器便会在只读数据区中放 abcdef \0 ,便把" abcdef "当作常量字符来看待;而此时,只要将常量字符的起始地址交给一个指针去维护即可;


总结

1、字符指针就是指针变量指向的对象是字符类型,即指针变量的类型为 char* ;

2、const char* p = "abcdefg"; \ char const * p = "abcdefg"; 指针p中存放的是常量字符串在常量区存放的首字符 'a' 的地址

3、常量字符串存放在内存中的常量区,常量区中的数据只能读取而不能被修改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1937214.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习基础入门(1)

最近也在努力的想要学习些机器学习的知识&#xff0c;目前正在了解各个概念及术语&#xff0c;下面就把学习到的概念都列出来。 人工智能 (AI) Artificial intelligence 人工智能生成内容&#xff08;AIGC&#xff09; 机器学习&#xff08;ML&#xff09; Machine Learning …

《汇编语言 基于x86处理器》- 读书笔记 - Visual Studio 2019 配置 MASM环境

安装 Visual Studio 2019 配置 MASM环境 下载 Visual Studio Installer安装 Visual Studio 20191. 双击运行2. 自定义安装内容3. 修改 MSVC 工具集版本4. 设置主题&#xff08;可选&#xff09;5. 安装代码高亮插件 AsmDude&#xff08;可选&#xff09;6. 通义灵码&#xff08…

【AI学习】关于Scaling Law的相关学习

一、苦涩的教训 首先&#xff0c;学习一段重要话语&#xff1a; The biggest lesson that can be read from 70 years of AI research is that general methods that leverage computation are ultimately the most effective, and by a large margin. 从70年的人工智能研究中…

服务器借助笔记本热点WIFI上网

一、同一局域网环境 1、当前环境&#xff0c;已有交换机组网环境&#xff0c;服务器已配置IP信息。 设备ip服务器125.10.100.12交换机125.10.100.0/24笔记本125.10.100.39 2、拓扑图 #mermaid-svg-D4moqMym9i0eeRBm {font-family:"trebuchet ms",verdana,arial,sa…

FastAPI(六十五)实战开发《在线课程学习系统》基础架构的搭建

在之前三篇&#xff0c;我们分享的就是需求的分析&#xff0c;基本接口的整理&#xff0c;数据库链接的配置。这次我们分享项目的基本框架&#xff0c;目录结构大致如下&#xff1a; common目录&#xff1a; 通用目录&#xff0c;放一些通用的处理 models目录&#xf…

达梦数据库(一)mysql2dm

达梦数据库(一)mysql2dm 文章目录 达梦数据库(一)mysql2dm一、安装篇ForWindows二、数据库初始化篇三、数据迁移篇出现的问题找不到对应表或者视图 注意字符集模式迁移出错大小写敏感解决方案 四、 代码修改篇group_concatGROUP BY方法一方法二(最笨)方法补充 多表联查更新参考…

【AI资讯】7.19日凌晨OpenAI发布迷你AI模型GPT-4o mini

性价比最高的小模型 北京时间7月19日凌晨&#xff0c;美国OpenAI公司推出一款新的 AI 模型“GPT-4o mini”&#xff0c;即GPT-4o的更小参数量、简化版本。OpenAI表示&#xff0c;GPT-4o mini是目前功能最强大、性价比最高的小参数模型&#xff0c;性能逼近原版GPT-4&#xff0…

python--实验15 数据分析与可视化

目录 知识点 1 数据分析概述 1.1流程 1.2定义 1.3数据分析常用工具 2 科学计算 2.1numpy 2.1.1定义 2.1.2创建数组的方式 2.1.3np.random的随机数函数 3 数据可视化 3.1定义 3.2基本思想 3.3Matplotlib库 3.3.1模块 4 数据分析 4.1Pandas 4.2数据结构 4.3基…

RE学习7.16-17

[HDCTF 2023]买了些什么呢 是一个经典的算法题吧 物品的重量和价值为: | 物品编号 | 重量 | 价值 | | 1 | 2 | 8 | | 2 | 5 | 1 | | 3 | 10 | 5 | | 4 | 9 | 9 | | 5 | 3 | 5 | | 6 | 6 | 6 | | 7 | 2 | 8 | | 8 | 2 | 2 | | 9 | 6 | 3 | | 10 | 8 | 7 | | 11 | 2 | 5 | | 1…

在 PostgreSQL 中怎样进行数据库的容量规划?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 在 PostgreSQL 中怎样进行数据库的容量规划&#xff1f;一、为什么容量规划如此重要&#xff1f;二、影…

探索 JavaScript Polyfill:跨越浏览器兼容性的桥梁

&#x1f389; 博客主页&#xff1a;【剑九 六千里-CSDN博客】 &#x1f3a8; 上一篇文章&#xff1a;【构建高效Node.js中间层&#xff1a;探索请求合并转发的艺术】 &#x1f3a0; 系列专栏&#xff1a;【面试题-八股系列】 &#x1f496; 感谢大家点赞&#x1f44d;收藏⭐评…

【Linux系统化学习】数据链路层

目录 数据链路层解决的问题 以太网 认识局域网 以太网帧格式 两个问题 认识MAC地址 认识MTU ARP协议 ARP协议的作用 ARP数据报格式 ARP协议的工作流程 数据链路层解决的问题 对于TCP/IP四层协议来说&#xff0c;数据链路层才是真正从传送数据进行跑腿办事情的&…

display: flex 和 justify-content: center 强大居中

你还在为居中而烦恼吗&#xff0c;水平居中多个元素、创建响应式布局、垂直和水平同时居中内容。它&#xff0c;display: flex 和 justify-content: center 都可以完成&#xff01; display: flex&#xff1a;将元素定义为flex容器 justify-content&#xff1a;定义项目在主轴…

分享:咕嘎批量查找文件移动存储系统,一次性查找多个PDF文件,如何根据txt文本列出的文件名批量查找指定文件夹里的文件,并复制到新的文件夹,不需要写任何代码,点点鼠标批量处理一次性搞定

简介&#xff1a; 该文介绍了一个批量查找PDF文件&#xff08;不限于找PDF&#xff09;的工具&#xff0c;用于在多级文件夹中快速查找并复制特定文件。用户可以加载PDF库&#xff0c;输入文件名列表&#xff0c;设置操作参数&#xff08;如保存路径、复制或删除&#xff09;及…

一个非常好的美图展示网站整站打包源码,集成了wordpress和开源版ripro主题,可以完美运营。

一个非常好的美图展示网站整站打包源码&#xff0c;集成了wordpress和开源版ripro主题&#xff0c;可以完美运营。 自带了5个多g的美图资源&#xff0c;让网站内容看起来非常大气丰富&#xff0c;可以快速投入运营。 这个代码包&#xff0c;原网站已经稳定运营多年&#xff0…

影响转化率的多元因素分析及定制开发AI智能名片S2B2C商城系统小程序的应用案例

摘要&#xff1a;在互联网时代&#xff0c;转化率是衡量营销活动成功与否的关键指标。本文首先分析了影响转化率的多种因素&#xff0c;包括活动页面的设计、活动的限时性、主题文案的吸引力、从众心理的运用&#xff0c;以及最核心的产品质量与优惠力度。接着&#xff0c;本文…

问题:4、商业保险与政策性保险的主要不同之处是:经营主体不同、经营目标不同、承保机制不同。 #学习方法#其他#学习方法

问题&#xff1a;4、商业保险与政策性保险的主要不同之处是&#xff1a;经营主体不同、经营目标不同、承保机制不同。 参考答案如图所示

SQL Server 使用 OPTION (RECOMPILE) 和查询存储的查询

设置 我们正在使用 WideWorldImporters 数据库&#xff0c;您可以从 Github 下载【sql-server-samples/samples/databases/wide-world-importers at master microsoft/sql-server-samples GitHub】。我正在运行SQL Server 2017 的最新 CU【https://sqlserverbuilds.b…

Adobe国际认证详解-网页设计认证专家行业应用场景解析

在当今数字化时代&#xff0c;网页设计已成为各行各业不可或缺的一环。而网页设计认证专家&#xff0c;作为经过Adobe国际认证体系严格考核的专业人才&#xff0c;正逐渐成为行业内炙手可热的存在。他们凭借深厚的网页设计理论基础和实践经验&#xff0c;为各行各业提供了高质量…

建筑工程企业项目管理系统哪个好?试试企智汇工程项目管理系统

在建筑工程行业中&#xff0c;项目管理的复杂性和挑战性是众所周知的。随着项目规模的扩大和技术的不断进步&#xff0c;传统的管理方法已经难以满足现代建筑工程的需求。企智汇工程项目管理系统应运而生&#xff0c;为建筑工程企业提供了一个全面、智能、高效的解决方案。 一…