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'
的地址。
- 字符串存放在
数组
中;即在内存(栈、静态全局区)中开辟了一段空间存放字符串。
定义了一个字符数组str,用来存放多个字符,并用"I love C!"给 str 数组初始化,
字符串 "I love C!" 存放在 str 中。
char str[100] = "I love C!";
注:
普通全局数组:内存分配在静态全局区。
普通局部数组:内存分配在栈区。
静态数组(静态全局数组、静态局部数组):内存分配在静态全局区。
- 字符串存放在
文字常量区
;在文字常量区开辟了一段空间存放字符串,将字符串首地址赋值给指针变量。
定义了一个字符指针变量 str,只能存放字符地址编号。
char *str = "I love C !";"I love C !" 这个字符串中的字符不是存放在 str 指针变量中。
str 只是存放了字符 'I' 的地址编号,"I love C !" 存放在文字常量区。
- 字符串存放在
堆区
;使用 malloc 等函数在堆区申请空间,将字符串拷贝到堆区。
动态申请了 10 个字节的存储空间,首地址给 str 赋值。
char* str = (char*) malloc(10);将字符串"I LOVE YOU !"拷贝到 str 指向的内存里。
strcpy(str, "I LOVE YOU !");
9.2 字符串的可修改性:
字符串内容是否可以修改,取决于字符串存放在哪里。
- 存放在数组中的字符串的内容可修改
char str[100] = "I love C !";
str[0] = 'x'; //正确可以修改的。
注:数组没有用 const 修饰。
- 文字常量区里的内容是不可修改的
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 重新赋值,让它指向别的地方。
- 堆区的内容是可以修改的
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 使用时赋值
- 字符数组:使用scanf 或者strcpy
char buf[20] = "hello world";
buf = "hello kitty"; 错误,因为字符数组的名字是个常量,不能用等号给常量赋值。
strcpy(buf, "hello kitty"); 正确,数组中的内容是可以修改的
scanf("%s", buf); 正确,数组中的内容是可以修改的
- 指针指向文字常量区
char *buf_point = “hello world”;
1) buf_point = "hello kitty"; 正确,buf_point 指向另一个字符串
2) strcpy(buf_point, "hello kitty"); 错误,这种情况,buf_point 指向的是文字常量区,内容只读。
当指针指向文字常量区的时候,不能通过指针修改文字常量区的内容。
- 指针指向堆区,堆区存放字符串
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 字符串的可修改性: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: http://cc3c6c27-e2df-4665-baba-1d9a32dc963e.node3.buuoj.cn/ 首页如下: 直接ping ip可以得到结果 常见管道符 1、|(就是按位或),直接执行|后面的语句 127.0.0.1 | cat /flag…...

【项目精选】javaEE土地档案管理系统(源码+论文+视频)
技术:java、jsp、struts、spring、hibernate 数据库:oracle 集成开发工具:eclipse 点击下载源码 本土地项目管理系统在可行性研究的基础上,是为了进一步明确土地项目管理系统的软件需求,以便安排项目规划和进度&#x…...

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

什么牌的运动耳机比较好、运动耳机排行榜10强
现在运动健身的潮流持续不下,而且人们长期坐于办公室办公,严重影响身体的健康,这时不论是去健身房锻炼,还是户外跑步都是非常必要的了,而蓝牙耳机作为运动必备的一款数码产品,更是受到了大家的青睐…...
华为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. 返回字典映射:resultMap6. 一对一查询:association7. 一对多查询:collection回顾一下,在上一篇 MyBatis 之二(增、删、改操作&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自由
说在前面 在微服务的应用开发中,DDD 用得越来越普及。 在40岁老架构师 尼恩的读者交流群(50)中,DDD是一个非常、非常高频的交流话题。 最近,有小伙伴面试阿里时,遇到一个面试题: 谈谈你对DDD的理解? 小伙…...

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

扬帆优配|杠杆资金重仓股曝光,3只科创板股获多路资金青睐
到2月16日,科创板融资余额环比前一日削减1104.16万元,其间,23股融资余额环比添加超千万元,融资净买入居前的有晶科动力、诺诚健华、爱博医疗等。 到2月16日,市场融资余额算计1.48万亿元,较前一交易日削减27…...
资讯汇总230217
230217 22:48 【美联储理事鲍曼:美国通胀仍旧太高】美联储理事鲍曼表示,美国通胀仍旧太高;美国当前的经济数据不一致,不同寻常的低失业率是一个好迹象;让通胀回到目标还有很长的路要走;需要继续加息&#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”,译为“汽车开放系统体系结构”;AUTOSAR是由 全球各大汽车整车厂、汽车零部件供应商、汽车电子软件系统公司联合建立的一套标准协议、软件架构。 2.为什么汽车行业要定义一个…...

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

C#中GDI+的矩形功能扩展
文章目录一、中心定位绘制图形1、矩形及椭圆中心定位2、圆的中心定位矩形二、圆角矩形三、收缩功能四、移动复制功能原文出处: https://haigear.blog.csdn.net/article/details/129060020GDI发展到GDI绘制函数中的参数往往都有矩形这个参数(除绘制直线和…...
数字经济活动题
讨论活动1-1:数字化 经济数字化(数据数字化,高速通信,大容量存储)将如何影响您所居住的国家?在网上搜索新闻文章(两三篇就够了),并讨论数字化如何影响经济、公共部…...

html 的相对路径和绝对路径
整篇文章是以 src 标签进行演示。 文章目录 一、相对路径 1、同级目录查找 2、上一级目录查找 3、下一级目录查找 二、绝对路径 一、相对路径 👵相对路径:从当前目录开始查找。 1、同级目录查找 写法: 1.1.直接写文件名字;…...
selenium进行QQ空间登录
一、selenium简要说明 selenium是基于浏览器自动化的一个模块,它能便捷的获取网站中动态加载的数据,和实现模拟登录、爬虫等操作 二、实现流程 2.1 selenium前置操作 1. 安装selenium模块 pip3 install selenium 2. 下载浏览器内核程序 注意࿱…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
AT模式下的全局锁冲突如何解决?
一、全局锁冲突解决方案 1. 业务层重试机制(推荐方案) Service public class OrderService {GlobalTransactionalRetryable(maxAttempts 3, backoff Backoff(delay 100))public void createOrder(OrderDTO order) {// 库存扣减(自动加全…...