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

C 指针的深造

C 指针

  • 1 关于内存那点事
  • 2 指针的概念
  • 3 指针变量的定义方法
  • 4 指针的分类
  • 5 指针和变量的关系
  • 6 指针和数组元素之间的关系
  • 7 指针数组
  • 8 指针的指针
  • 9 字符串和指针
    • 9.1 字符串的定义
    • 9.2 字符串的可修改性:
    • 9.3 初始化赋值
    • 9.4 使用时赋值
    • 9.5 字符串和指针总结
  • 10 数组指针
  • 11 指针和函数的关系
  • 12 经常容易混淆的指针概念
  • 13 特殊指针

1 关于内存那点事

2 指针的概念

3 指针变量的定义方法

4 指针的分类

5 指针和变量的关系

6 指针和数组元素之间的关系

7 指针数组

8 指针的指针

9 字符串和指针

9.1 字符串的定义

字符串就是以 \0 结尾的若干的字符的集合。
字符串的地址,是第一个字符的地址。如:字符串 "I Love You !" 的地址,即字符串中字符 'I' 的地址。

  1. 字符串存放在 数组 中;即在内存(栈、静态全局区)中开辟了一段空间存放字符串。
定义了一个字符数组str,用来存放多个字符,并用"I love C!"给 str 数组初始化,
字符串 "I love C!" 存放在 str 中。
char str[100] = "I love C!";

注:
普通全局数组:内存分配在静态全局区
普通局部数组:内存分配在栈区
静态数组(静态全局数组、静态局部数组):内存分配在静态全局区

  1. 字符串存放在 文字常量区;在文字常量区开辟了一段空间存放字符串,将字符串首地址赋值给指针变量。
定义了一个字符指针变量 str,只能存放字符地址编号。
char *str = "I love C !";"I love C !" 这个字符串中的字符不是存放在 str 指针变量中。
str 只是存放了字符 'I' 的地址编号,"I love C !" 存放在文字常量区。
  1. 字符串存放在 堆区;使用 malloc 等函数在堆区申请空间,将字符串拷贝到堆区。
动态申请了 10 个字节的存储空间,首地址给 str 赋值。
char* str = (char*) malloc(10);将字符串"I LOVE YOU !"拷贝到 str 指向的内存里。
strcpy(str, "I LOVE YOU !");

9.2 字符串的可修改性:

字符串内容是否可以修改,取决于字符串存放在哪里。

  1. 存放在数组中的字符串的内容可修改
char str[100] = "I love C !";
str[0] = 'x'; //正确可以修改的。
注:数组没有用 const 修饰。
  1. 文字常量区里的内容是不可修改的

char *str = "I love C !";
printf("str = %s\n", str);//"I love C !"
printf("str = %s\n", str+2);//"love C !"错误!'I' 存放在文字常量区,不可修改。
*str = 'x'; //这么二次赋值 是错误的哦!!!错误!编译无错,但是赋值结果会导致数据错乱,因为没有正确的结束符!(赋值字符串地址是可以的哦)
char a = 'a';
str = &a;

注:
1、str 指向文字常量区的时候,它指向的内存的内容不可被修改。
2、str 是指针变量可以指向别的地方,即可以给str 重新赋值,让它指向别的地方。

  1. 堆区的内容是可以修改的
char *str = (char*)malloc(10);
strcpy(str, "I love C");
*str = 'y; //正确,可以,因为堆区内容是可修改的

注:
1、str 指向堆区的时候,str 指向的内存内容是可以被修改的。
2、str 是指针变量,也可以指向别的地方。即可以给str 重新赋值,让它指向别的地方

注意:
str 指针指向的内存能不能被修改,要看 str 指向哪里。
str 指向文字常量区的时候,内存里的内容不可修改
str 指向数组(非const 修饰)、堆区的时候,它指向内存的内容是可以修改

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <malloc.h>int main(int argc, char* argv[])
{char* str = (char*)malloc(sizeof(char)*32);if(str){strcpy(str, "I love C");strcpy_s(str, 32, "I love C");}printf("--str = %s--\n", str); //--str = I love C--if (str) {*str = 'y'; //正确,可以,因为堆区内容是可修改的}printf("--str = %s--\n", str); //--str = y love C--return 0;
}

9.3 初始化赋值

1.字符数组初始化:

char buf_aver[20] = "hello world";

2.指针指向文字常量区,初始化:

char *buf_point = "hello world";

3、指针指向堆区,堆区存放字符串。
不能初始化,只能先给指针赋值,让指针指向堆区,再使用strcpy、scanf 等方法把字符串拷贝到堆区。

char *buf_heap;
buf_heap = (char *)malloc(15);
strcpy(buf_heap, "hello world");
scanf("%s", buf_heap);

9.4 使用时赋值

  1. 字符数组:使用scanf 或者strcpy
char buf[20] = "hello world";
buf = "hello kitty"; 错误,因为字符数组的名字是个常量,不能用等号给常量赋值。
strcpy(buf, "hello kitty"); 正确,数组中的内容是可以修改的
scanf("%s", buf); 正确,数组中的内容是可以修改的
  1. 指针指向文字常量区
char *buf_point = “hello world”;
1) buf_point = "hello kitty"; 正确,buf_point 指向另一个字符串
2) strcpy(buf_point, "hello kitty"); 错误,这种情况,buf_point 指向的是文字常量区,内容只读。

当指针指向文字常量区的时候,不能通过指针修改文字常量区的内容。

  1. 指针指向堆区,堆区存放字符串
char *buf_heap;
buf_heap = (char *)malloc(15);
strcpy(buf_heap, "hello world");
scanf("%s", buf_heap);

9.5 字符串和指针总结

1、指针可以指向 文字常量区
1)指针指向的文字常量区的内容不可以修改
2)指针的指向可以改变,即可以给指针变量重新赋值,指针变量指向别的地方。

2、指针可以指向 堆区
1)指针指向的堆区的内容可以修改。
2)指针的指向可以改变,即可以给指针变量重新赋值,指针变量指向别的地方。

3、指针也可以指向 数组(非const 修饰)
char buf[20] = "hello world";
char *str = buf;
这种情况下
1)可以修改buf 数组的内容。
2)可以通过str 修改str 指向的内存的内容,即数组buf 的内容。
3)不能给buf 赋值 buf = “hello kitty”; 错误的。
4)可以给str 赋值,及str 指向别处。str = “hello kitty”;

10 数组指针

11 指针和函数的关系

12 经常容易混淆的指针概念

13 特殊指针

相关文章:

C 指针的深造

C 指针1 关于内存那点事2 指针的概念3 指针变量的定义方法4 指针的分类5 指针和变量的关系6 指针和数组元素之间的关系7 指针数组8 指针的指针9 字符串和指针9.1 字符串的定义9.2 字符串的可修改性&#xff1a;9.3 初始化赋值9.4 使用时赋值9.5 字符串和指针总结10 数组指针11 …...

大数据之-Nifi-应用场景2-2_设置putfile处理器自动创建目标文件夹_以及存在重复文件时自动覆盖---大数据之Nifi工作笔记0006

上一节我们留了两个问题,一个是,如果我们没有创建putfile要写入的目标文件夹,会报错吗? 可以看到我们putfile目标文件夹是上面这个目录 我们来试一试,如果目标文件夹不存在,putfile处理器会自动创建吗 首先我们删除这个target目标文件夹 然后我们进入cd source目录,源文件夹目…...

buuctf Web 下

9.[ACTF2020 新生赛]Exec 访问url&#xff1a; http://cc3c6c27-e2df-4665-baba-1d9a32dc963e.node3.buuoj.cn/ 首页如下&#xff1a; 直接ping ip可以得到结果 常见管道符 1、|&#xff08;就是按位或&#xff09;&#xff0c;直接执行|后面的语句 127.0.0.1 | cat /flag…...

【项目精选】javaEE土地档案管理系统(源码+论文+视频)

技术&#xff1a;java、jsp、struts、spring、hibernate 数据库&#xff1a;oracle 集成开发工具&#xff1a;eclipse 点击下载源码 本土地项目管理系统在可行性研究的基础上&#xff0c;是为了进一步明确土地项目管理系统的软件需求&#xff0c;以便安排项目规划和进度&#x…...

JVM那些事——垃圾回收和内存分配

内存分配 默认情况下新生代和老年区的内存比例是1:2&#xff0c;新生代中Eden区和Survivor区的比例是8:1。 对象优先分配在Eden区。大对象直接进入老年区。通过-XX:PertenureizeThreshold参数设置临界值。长期存活的对象进入老年区。对象每熬过一次Minor GC&#xff0c;年龄1&…...

什么牌的运动耳机比较好、运动耳机排行榜10强

现在运动健身的潮流持续不下&#xff0c;而且人们长期坐于办公室办公&#xff0c;严重影响身体的健康&#xff0c;这时不论是去健身房锻炼&#xff0c;还是户外跑步都是非常必要的了&#xff0c;而蓝牙耳机作为运动必备的一款数码产品&#xff0c;更是受到了大家的青睐&#xf…...

华为OD机试题 - N 进制减法(JavaScript)

最近更新的博客 2023新华为OD机试题 - 斗地主(JavaScript)2023新华为OD机试题 - 箱子之形摆放(JavaScript)2023新华为OD机试题 - 考古学家(JavaScript)2023新华为OD机试题 - 相同数字的积木游戏 1(JavaScript)2023新华为OD机试题 - 最多等和不相交连续子序列(JavaScri…...

MyBatis 之三(查询操作 占位符#{} 与 ${}、like查询、resultMap、association、collection)

文章目录1. 参数占位符 #{} 和 ${} 的区别2. ${} 的优点3. SQL 注入问题4. like 查询5. 返回字典映射&#xff1a;resultMap6. 一对一查询&#xff1a;association7. 一对多查询&#xff1a;collection回顾一下&#xff0c;在上一篇 MyBatis 之二&#xff08;增、删、改操作&am…...

【云原生之Docker实战】使用Docker部署Web在线聊天室Rocket.Chat

【云原生之Docker实战】使用Docker部署Web在线聊天室Rocket.Chat 一、Rocket.Chat介绍二、检查本地系统环境1.检查系统版本2.检查docker版本3.检查docker状态4.检查docker compose版本三、下载Rocket.Chat镜像四、部署Rocket.Chat1.创建部署目录2.编辑docker-compose.yaml文件3…...

阿里一面:谈一下你对DDD的理解?2W字,帮你实现DDD自由

说在前面 在微服务的应用开发中&#xff0c;DDD 用得越来越普及。 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;DDD是一个非常、非常高频的交流话题。 最近&#xff0c;有小伙伴面试阿里时&#xff0c;遇到一个面试题&#xff1a; 谈谈你对DDD的理解&#xff1f; 小伙…...

嵌入式Linux入门级板卡的神经网络框架ncnn移植与测试-米尔i.MX6UL开发板

本篇测评由电子发烧友的优秀测评者“ALSET”提供。 米尔 MYD-Y6ULX-V2 开发板&#xff0c;基于 NXP i.MX6UL/i.MX6UL L处理器&#xff0c;该开发板被米尔称之为经典王牌产品。本次测试目标是在此开发板上进行神经网络框架ncnn的移植与测试开发&#xff0c;测试ncnn在此开发板上…...

扬帆优配|杠杆资金重仓股曝光,3只科创板股获多路资金青睐

到2月16日&#xff0c;科创板融资余额环比前一日削减1104.16万元&#xff0c;其间&#xff0c;23股融资余额环比添加超千万元&#xff0c;融资净买入居前的有晶科动力、诺诚健华、爱博医疗等。 到2月16日&#xff0c;市场融资余额算计1.48万亿元&#xff0c;较前一交易日削减27…...

资讯汇总230217

230217 22:48 【美联储理事鲍曼&#xff1a;美国通胀仍旧太高】美联储理事鲍曼表示&#xff0c;美国通胀仍旧太高&#xff1b;美国当前的经济数据不一致&#xff0c;不同寻常的低失业率是一个好迹象&#xff1b;让通胀回到目标还有很长的路要走&#xff1b;需要继续加息&#x…...

前置知识- 初值问题、ode 系列函数的用法、刚性 (stiff) 方程简介、高阶微分方程的降阶

1.1.4 龙格一库塔法 将向前欧拉法写成式 (1-37) 的形式, 可以看出它实际上利用了 f ( x , u ) f(x, u) f(x,u) 在 x n...

# AutoSar一文概览

1.什么是AutoSar ​ AUTOSAR全称为“AUTomotive Open System ARchitecture”&#xff0c;译为“汽车开放系统体系结构”&#xff1b;AUTOSAR是由 全球各大汽车整车厂、汽车零部件供应商、汽车电子软件系统公司联合建立的一套标准协议、软件架构。 2.为什么汽车行业要定义一个…...

分享88个HTML旅游交通模板,总有一款适合您

88个HTML旅游交通模板下载链接&#xff1a;https://pan.baidu.com/s/1pziNhgpC53h3KZy_a-aAFQ?pwdf99e 提取码&#xff1a;f99e Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 HTML5旅行公司旅行社网站模板 HTML5旅行公司旅行社网站模板是一款提供旅行服务的公司…...

C#中GDI+的矩形功能扩展

文章目录一、中心定位绘制图形1、矩形及椭圆中心定位2、圆的中心定位矩形二、圆角矩形三、收缩功能四、移动复制功能原文出处&#xff1a; https://haigear.blog.csdn.net/article/details/129060020GDI发展到GDI绘制函数中的参数往往都有矩形这个参数&#xff08;除绘制直线和…...

数字经济活动题

讨论活动1-1&#xff1a;数字化 经济数字化&#xff08;数据数字化&#xff0c;高速通信&#xff0c;大容量存储&#xff09;将如何影响您所居住的国家&#xff1f;在网上搜索新闻文章&#xff08;两三篇就够了&#xff09;&#xff0c;并讨论数字化如何影响经济、公共部…...

html 的相对路径和绝对路径

整篇文章是以 src 标签进行演示。 文章目录 一、相对路径 1、同级目录查找 2、上一级目录查找 3、下一级目录查找 二、绝对路径 一、相对路径 &#x1f475;相对路径&#xff1a;从当前目录开始查找。 1、同级目录查找 写法&#xff1a; 1.1.直接写文件名字&#xff1b;…...

selenium进行QQ空间登录

一、selenium简要说明 selenium是基于浏览器自动化的一个模块&#xff0c;它能便捷的获取网站中动态加载的数据&#xff0c;和实现模拟登录、爬虫等操作 二、实现流程 2.1 selenium前置操作 1. 安装selenium模块 pip3 install selenium 2. 下载浏览器内核程序 注意&#xff1…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...