指针


1.指针


指针 就是地址
(地址就是内存单元的编号)

指针变量 
(结合语境) 
eg:
定义一个指针
指针这一类数据 --- 数据类型 --- 指针类型 
(1).指针 是什么 
(2).指针类型 

   int a; //int数据类型 a是int型变量 
//a的空间 想来存储 整型数据 

      

2.指针的定义 


基类型 * 指针变量名;

int a = 10;
int *p = &a;
指针变量本身       // p      
指针变量指向的目标  // a
begin   //指针变量本身 --- 放的是一个地址 
*begin  //基类型  

3.指针间接访问 


通过指针来使用内存空间 

*p 
step1:拿p中的值 到内存中定位 
step2:从定位处开始,偏移sizeof(基类型)大小一块空间
step3:将这块空间当做一个基类型(变量/数据)来看 


*p <=> a

4. 指针用途 
函数带出多个参数 
操作硬件 
函数参数 

核心:
被调        修改          主调 
实现的两个要素:
a.要修改谁,传谁的地址  //拿到地址 --只是知道在哪儿呢? 
b.被调函数中,要有对应*p这种运算 //如何用-- 用 


5.指针使用数组 


整型一维数组 


(1).指针运算 
指针 + 1  //

指针 相减 ---减出来的 数据是个整型数据 
差了多少基类型

指针 关系运算 
(2).指针能够操作数组 
a.数组的特点
b.只需要获得首元素地址即可 


指针 + 字符型数组

char s[10] = "hello";  //字符串 --- 存放在栈空间 
// 堆区  也可以放 
// 全局 
// 字符串常量区

char *p = "hello"; //字符串常量 --没有数组名的数组                         


char *p = s;
s[0]   //char 
&s[0]  //char * 
说明:
指针代表的位置 ---地址的含义 ---说明在哪里
先用对应的空间 --- *p 


区分(考点)


char s[] = "hello";  //s本身的空间在栈上 ,"hello"本身是字符串常量,存放字符串常量区
//用字符串常量区中 "hello" 初始化了 栈上s的空间

//注意: s[0] = 'h'; (正确) --- 栈上的空间可读可写      

                       有两个“hello”,一个在常量区,一个在栈上


char *s = "hello";   //s本身的空间在栈上,s是char*的指针变量,用来存放一个 char *的地址 
//"hello"本身是字符串常量,存放字符串常量区
//"hello"字符串都是按字符数组的方式存储的 
//相当于是一个匿名数组 ---- 获得的还是首元素的地址
//注意: s[0] = 'h'; (错误) ---常量区空间不能修改          

                  
const


const char * s = "hello";
int a;        //变量  --可读可写 
const int a;  //只读变量 -- 只读

const 本身的作用 : 限定为只读 


 const char * s; //const 用来修饰基类型  --- 限定基类型为只读 ---只是说,不能通过*p 修改,相当于限定了*p为只读
char const * s; //const 用来修饰基类型  --- 限定基类型为只读 

char const *s(等价于 const char *s

  • 含义:指向常量字符的指针

    • const 修饰的是 char,表示指针 s 所指向的字符是 不可修改的(常量)。
    • 但指针 s 本身是 可以改变指向的(可以指向其他字符)。

 char * const s;  //const 用来修饰指针变量本身 --- 将指针变量本身限定为只读---指针变量本身不能被修改 



 const char const *s; //指针变量 本身不能被修改 
//*s 也不能被修改   

char *const s

  • 含义:指向字符的常量指针

    • const 修饰的是指针 s 本身,表示指针 s 的 指向是固定的(不能改变)。
    • 但指针 s 所指向的字符是 可以修改的

 const 修饰指针的时候:
区分
修饰指针变量本身 
修饰基类型 
 规则:
距离谁近 就修饰谁
就近原则
 

说明:
1.const 可以将运行错误提前 
2.const 修饰函数的形参 
a.提高了参数的适用性 
//数组名 
//char *
//const char *
b.防止函数误操作 
建议,能写成const 都写成const
void Puts(char *s)
void Puts(const char *s)  
int puts(const char *s); //const 什么时候,如果函数中只是用数据,而不涉及修改操作,一般都建议写成const 


练习:
strlen 
int Strlen(const char *s)
{
}



练习:
strcpy 

char *Strcpy(char *dest, const char *src)
{     
char *ret = dest;
拷贝 
return ret;
}

   返回值  返回值 dest 


char *Strncpy(char *dest, const char *src, size_t n)
{
char *ret = dest;
//始终拷贝了n次 
// n < 字符串长度 那么n次拷完 就结束 
// n > 字符串长度 字符串拷贝完成, n剩余的次数还要拷贝 --- 拷贝的是 0
return ret;
}

n 表示 将src的前n个字符拷贝到dest中 
将前n个字符拷贝到dest中,但是如果前n个中没有 '\0' 那dest中也不会后 

n 大于 字符串长度 保证n次 拷贝够 
剩余的次数 通通拷贝 0


练习:
strcat 

char *Strcat(char *dest, const char *src)
{    
//1.定位到dest 的 '\0'位置 
//2.拷贝 
//3.保证 dest 是字符串     
}

//将src中前n个字符拼接到dest中
char *strncat(char *dest, const char *src, size_t n);
{
//1.定位到dest 的 '\0'位置 
//2.拷贝 
//n < strlen(src)  前n字符拼接完 就结束 --- 最后保证是字符串 --dest最后要加'\0'
//n > strlen(src)  将src拼接完成 就结束 --- 最后保证是字符串 --dest最后要加'\0'
//3.保证 dest 是字符串    
}


练习:
strcmp

int Strcmp(const char *s1, const char *s2)
{
从左到右 逐个比 
遇到不同的 或者 '\0'

}
//表示 比较 s1 和 s2 前n个字符 
//hello
//help

int Strncmp(const char *s1, const char *s2, size_t n)
{

}

小结:
1.语法 --- 指针要操作数组 只需要获得首元素的地址 
2.字符串 --- 字符串有结束标志 
3.栈上的字符串
常量区中的字符串 



指针 + 二维数组 

指针 + 整型二维 

int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};

指针要操作数组 只需要获得首元素的地址 

? * p 
二维数组的本质:
int[4] a[3];           //元素类型 int[4] //a[0]
二维数组中首元素 
a[0]             // 首元素的数据类型 ---int[4] 
&a[0]                 // int[4] *   //指针类型 


int[4] *p; //理解没问题 

int (*p) [4]; //表示定义了一个指针 指向int[4]这种类型 
//指向的目标是个数组类型 --- 数组指针

              

*(p+1) <=> a[1] //表示可以用一整行的空间  
//a[1] <=> *(p+1)
//a[1] 相当于是 内部的 一整行数组的 数组名 (*(p+1))
//  数组名 代表的类型  整个数组大小    // int[4]这种类型
//  数组名 代表的值   首元素的地址    // &a[1][0]
//       地址的类型 --- int *

*(p+1)  //代表  第 1 行的首元素的地址 

*(p+1) + 1   // 第1行 第1列 元素的地址 
*(*(p+1) + 1) //  第1行 第1列 的 元素 //变量 


二维数组 ,通过指针访问数组元素:

p+i              //第i行的 地址 
*(p+i)            //第i行的 首元素 的地址  --- 内部的一维数组的数组名 
*(p+i)+j          //第i行的 第j列 元素的地址
*(*(p+i)+j)      //第i行 第j列 的元素

//访问到二维数组元素的方式:
*(*(p+i)+j) 
*(p[i]+j)
*(*(p++)+j)
*(*(a++)+j) //数组名 --- 代表首元素地址 --- 地址常量 a 是个常量, a++ 不能做 
*(a[i]+j) 
-----------------------------------------------------------------

练习:
实现一个函数 找出数组中最大值 

指针 + 字符二维数组 
char s[3][10] = {"hello","world","china"};

char (*p)[10] = s;

练习:
实现一个输入函数,可以从键盘输入字符串 

void scanfStr(char (*s)[10],int row)
{

}
练习:
//找最大值 



作业:

1. 编写一个程序实现功能:
将字符串”Computer Science”赋给一个字符数组,
然后从第一个字母开始间隔的输出该字符串,用指针完成。
"Cmue cec"



2. 编写程序实现单词的倒置
"how are you" -> "you are how"

//char s1[] = "how";

3. 封装一个函数,统计一个字符串中出现指定单词的个数
int WordCnt(char *pStr, char *pWord)
{
}
"fdsahelfdashellofdashellofdashellofdashellohello"
"hello"

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

密码学基础知识总结

密码学基础知识总结 一、Base编码 1. Base系列特征 编码类型字符集特征Base160-9, A-F密文长度偶数Base32A-Z, 2-7包含数字2-7Base64a-z,0-9,,/,密文长度是8的倍数Base36A-Z,0-9仅支持整数加密Base910-9,a-z,A-Z,特殊符号高密度编码Base100Emoji表情表情符号组成 2. 典型题型…

PostgreSQL 中 pg_wal文件过多过大的清理方法及关键注意事项的总结

PostgreSQL 中 pg_wal文件过多过大的清理方法及关键注意事项的总结 以下是针对 PostgreSQL 中 pg_wal 文件过多过大的清理方法及关键注意事项的总结 一、安全清理 WAL 文件的完整流程 1. 确认数据库和备份完整性 备份验证&#xff1a;确保最近的物理备份&#xff08;如 pg_base…

Django事务支持

1.事务概念 事务是一组不可分割的操作序列&#xff0c;这些操作要么全部执行&#xff0c;要么全部不执行。事务具有四个关键属性&#xff0c;通常称为 ACID 特性&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a;事务是一个不可分割的工作单位&#xff0c;事务…

<form> + <iframe> 方式下载大文件的机制

使用 <form> <iframe> 方式下载大文件的机制之所以稳定&#xff0c;核心在于其‌分块传输‌和‌浏览器沙箱隔离‌设计。以下是技术原理详解&#xff1a; 一、底层工作机制 ‌分块传输协议‌ 表单提交后&#xff0c;服务器按 Transfer-Encoding: chunked 分块返回数…

Python--OCR(2)

一、明确 OCR 任务边界首先定义 OCR 系统的核心目标&#xff1a;场景&#xff1a;印刷体&#xff08;如文档、发票&#xff09;/ 手写体&#xff08;如笔记&#xff09;/ 特定场景&#xff08;如车牌、身份证&#xff09;输入&#xff1a;图像格式&#xff08;JPG/PNG&#xff…

基于Django的计算机资源爬虫及可视化系统的设计与实现

文章目录有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主一、项目背景二、项目目标三、系统架构与技术选型四、系统功能模块五、应用场景与价值六、项目特色与创新点七、总结每文一语有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试…

SH3001六轴传感器应用(二)(IIC驱动开发)

一、前言我这边使用的开发板原本已经做好了该sensor的驱动&#xff0c;但是使用过程中发现&#xff0c;原始驱动sensor是通过事件的方式上报的&#xff0c;加速度和陀螺仪数据并不同步&#xff0c;不满足使用要求&#xff0c;只有重新写一个iic的驱动&#xff0c;进行sensor数据…

面试题:基础的sql命令

基础的 SQL 命令主要用于对数据库进行查询、新增、修改、删除等操作&#xff0c;可分为以下几类&#xff1a;一、数据查询&#xff08;SELECT&#xff09;用于从表中获取数据&#xff0c;是最常用的命令。 基本语法&#xff1a;SELECT 列名1, 列名2... FROM 表名 WHERE 条件;示…

Leetcode-3488距离最小相等元素查询

依旧二分&#xff0c;链接如下3488. 距离最小相等元素查询 看题目是个循环数组&#xff0c;记得当时做过一道什么题也是循环数组&#xff0c;就想着直接数组复制一下&#xff0c;然后跟上一道题一样&#xff0c;用hashmap来存储value的值以及value对应下标的vector。 和灵神的…

C++中的关联容器

文章目录使用关联容器定义关联容器关键字类型的要求pair类型用作返回类型关联容器上的操作关联容器的迭代器关联容器和算法添加元素删除元素map的下标操作访问元素无序容器对关键字的要求关联容器支持高效的关键字查找和访问。两个主要的关联容器的类型是map和set。其中map中的…

【Git】git提交代码报错Git: husky > pre-commit

git提交代码报错原因 这个问题是因为当你在终端输入git commit -m “XXX”,提交代码的时候,pre-commit(客户端)钩子&#xff0c;它会在Git键入提交信息前运行做代码风格检查。如果代码不符合相应规则&#xff0c;则报错&#xff0c;而它的检测规则就是根据.git/hooks/pre-commi…

Unity开发者快速认识Unreal 的C++(六)GameMode之PlayerController

继承关系&#xff1a;Aactor&#xff0c;INavAgentInterface <--- AController<--- PlayerController &#xff0c;PlayerController也是一个Actor,继承了Actor的一些通用的属性和工具函数下图是PlayerController初始化组件的一个子阶段从图中可以得到的信息是&#xf…

Vue 3 服务端渲染(SSR)与客户端渲染(CSR)的区别及解决方案

1. SSR与CSR的区别1.1. SSR的原理服务端渲染&#xff08;SSR&#xff09;是在服务器端将 Vue 组件渲染为 HTML 字符串&#xff0c;并将其发送给客户端。这种方式与客户端渲染&#xff08;CSR&#xff09;不同&#xff0c;后者是在浏览器中执行 JavaScript 来生成 HTML。在 SSR …

Matlab快速回顾

一1.数值 显示 格式format style 设置eg: pi format longE;or2.清除指令clc 清除命令行窗口clear 清除工作区cls3.搜索路径设置path(path,E:\ads\)oraddpath4.M文件用户把要实现的命令写在一个以.m为扩展的文件中&#xff0c;然后由matlab系统进行解读&#xff0c;最后运行结果…

开源低代码+AI引擎:百特搭企业级开发平台的演进

在数字化转型进入深水区的今天&#xff0c;企业应用开发面临前所未有的复杂挑战&#xff1a;既要快速响应业务需求&#xff0c;又要确保系统灵活可控&#xff1b;既要降低技术门槛&#xff0c;又要保障核心安全。传统开发模式与单一形态的低代码工具已难以满足多层次需求。融合…

学习 Android(十五)NDK进阶及性能优化

学习 Android&#xff08;十五&#xff09;NDK进阶及性能优化 对 NDK 相关知识有了初步的了解之后&#xff0c;我们可以更加深入的去学习 NDK 相关知识&#xff0c;接下来&#xff0c;我们将按照以下步骤进行深入学习&#xff1a; 深入理解JNI调用过程和性能消耗常见 JNI 坑&am…

QT5.12.8 QTabWidget 透明样式QSS

/* 设置QTabWidget本身 :不加也行*/ QTabWidget#aaa_tabwdt {background: transparent;border: none; /* 移除边框可能有助于透明效果 */ }/* 标签页内的容器部件 :必须加&#xff0c;标签也才会透明 */ QTabWidget#aaa_tabwdt QWidget, QTabWidget#aaa_tabwdt QFrame {backgro…

【FAQ】Script导出SharePoint 目录文件列表并统计大小

一、只导出文件列表的方法 1) 保存脚本&#xff08;建议名&#xff1a;D:\tmp\Export-SharePoint-FileList.ps1&#xff09; <# 导出 SharePoint 指定文件夹&#xff08;含子文件夹&#xff09;的文件列表到 CSV&#xff08;不统计大小&#xff09; 前提&#xff1a;已安…

《Thinking in Java》读书笔记---控制执行流程

就像有感知的生物一样&#xff0c;程序必须在执行过程中控制它的世界&#xff0c;并做出选择。在Java中&#xff0c;你要使用执行控制语句来作出选择。一、流程控制基础概念1.1 流程控制的重要性流程控制结构决定了程序执行的顺序和逻辑分支&#xff0c;是编程语言中最基础也是…

极验 G-star 人才特训营:为业务安全领域培养下一代新兴力量

本文导读 极验为什么要启动 G-star 实习生培养计划&#xff1f;50多位来自多所高校的同学&#xff0c;在极验经历了一场怎样的“非典型”实习&#xff1f;技术大咖亲授&#xff0c;先培训再实战&#xff0c;极验打造的是怎样的人才体系&#xff1f;同学有话说&#xff1a;培养计…