C语言指针重学

学习要纲:建议掌握
gdb调试(b ,d ,fin ,bt ,print ,awatch ,up ,down ,set pretty等)
SourceInsight软件看代码(全局搜索 文件搜索等)
git如何调取分支合并(git branch,git blame,git log,git pull,git reset --hard等)
等内容,下面是对于指针的一个重新学习.
C语言的指针:

  • 使得程序简单、紧凑、高效
  • 有效地表示复杂数据结构
  • 动态分配内存
  • 得到多于一个的函数返回值

1.指针的基本用法

A.地址和变量:在计算机的内存中,每一个字节单元,都有一个编号,称为地址。

在C语言之中,内存单元的地址称为指针,专门用来存放地址的变量称为指针变量

1byte = 8 bits

<存储类型> <数据类型> * <指针变量名> = <地址量>;

使用*取出相应的值,*p / *(&a)

B.指针的赋值运算值的是通过赋值运算符指向地址变量送一个地址值

注意:一般在Centos之中指针的大小都为四个字节

0x 00 00 00 00 - 0x FF FF FF FF :四个字节 2^(4*8)-1

2.指针的运算

指针运算是指以指针变量所存放的地址量作为运算量而进行的运算

p + n:指针向着大地址方向进行移动,表示p + sizeof(p 的类型) * n,为地址量
px -py:指数据的个数

3.指针与数组

4.指针与二维数组

5.指针与字符串

A.字符指针

B.注意点
初始化字符指针是把内存中字符串的首地址赋予指针,而不是把该字符串复制到指针中

char str[] = "Hello World";
char *p = str;
char ch1[] = "Hello World";
char ch2[] = "Hello World";

注意:ch1和ch2虽然是内容相同的,但是地址是不同的.
c.在C编程过程中,当一个字符指针指向一个字符串常量时,不能够修改指针指向的对象的值

char *p = "Hello World";
char *p = 'H';//错误,字符指针常量是不允许改变的

这个地方是一个易错点:

可以见到字符串常量的地址是相同的,且输出字符指针的方式是直接打印其值.

给出一个错误案例:

想要把第一个字母变成小写,会出现Segmentation fault报错,说明内存访问过程出现了问题.

6.二级指针

A.

B.

C.稍微进阶版---此处需要结合指针与字符串进行学习
 

#include <stdio.h>int main()
{char *s[] = { "apple", "pear", "potato" };char ** p;int i, n;i = 0;n = sizeof(s) / sizeof(char *);p = &s[0];while (i < n){printf("%s %s\n",s[i],*(p+i));i++;}getchar();return 0;}

7.void指针和const修饰符

void指针是一种不确定数据类型的指针变量,在没有进行强制类型转换之前,不能进行任何指针的算数运算.
A.一般形式:void *<指针变量名称>

可以见到*p 和 *q是非法间接寻址,因为不知道如何取类型的地址大小.
当将* p变为* (int *)p即可

注意:void指针在进行使用的时候必须要进行强制转换.

B.对于void指针在没有进行强制类型转换之前是不能够进行任何的算数运算


 

C.const变量

常量化变量值
const <数据类型> 变量名 = [<表达式>];

常量化变量是死了使得变量的值不被修改,变量有const修饰时,想要用指针间接访问变量,指针也要有const修饰.

①const int *p ------ 

不能够通过指针改变目标值.

② int * const p ------ 

只能够将上面的赋值过程变为int const *q = &m,也就是q的地址不能够修改

也就是const修饰谁,谁可以不可以修改

③const int * const r = &m;
任何值都不能更改

D.main函数是否可以带参数,涉及到const指针

int main(int argc,const char * argc[])注意这个地方是针对于在Centos系统下想起来一个命令
gcc -std=c++11 ys.cpp -o a
注意:这个地方的
int argc = 1
const char * argc[] = {"./a","192.168.6.118"}

8.函数参数的用法

A.函数之间参数的传递
①全局变量传递参数

形参的地址不一样

②复制传递

调用函数将实参传递给被调用函数,被调用函数将创建同类型的形参并用实参进行初始化.

形参是新开辟的存储空间,在函数中改变形参的值,不会影响到实参.

③地址传递
按照地址进行传递,实参为变量的地址,形参是同类型的指针;
被调用函数中对形参的操作,将直接改变实参的值(被调用函数对指针目标的操作相当于对实参本身的操作)

编写一个函数,统计字符串中小写字母的个数,并把字符串中的小写字母转化成大写字母
a.统计字符串中小写字母的个数

注意:当然这个功能是非常容易进行实现的,需要进行注意的是这个地方的形参为什么是定义的为const char *p,这样定义的话就是不会改变其*p的内容,和前面的内容进行了串联.

b.将小写字母转换为大写字母

这个地方需要进行注意空格的ascll为32.

B.数组传递参数

三种方式:

①全局数组传递方式

②复制传递方式
例题:编写函数,计算一个一维整型数组的所有元素的和
实参为数组的指针,形参为数组名(本质是一个指针变量)

对于上面那句话的解读是,比如说一个形参 int p[],相当于int *p

③地址传递方式
实参为数组的指针,,形参为同类型的指针
例题:去掉字符串里面的空格

9.指针函数

A.指针函数是指一个函数的返回值为地址量的函数

指针函数的定义一般形式如下:

<数据类型> * <函数名称>(<参数说明>)
{

}

举个例子:请你说出下面代码的问题

这个地方的str[20]是局部变量,是在栈上的,返回不了了
结果是乱码了,如下所示:

原因是在于:之前租的房子,现在进不去了,所以打印出来的是乱码看不见.

改进方式: 
①将其变为全局变量 char str[20] 改法看起来怪怪的
②改变为静态变量     static char str[20] ------ 可用
③变成全局字符串常量 char * str = "Hello"; 不能够进行修改
④使用malloc的方式

B.
 

#include <stdio.h>// 定义一个返回int类型指针的函数
int* find_max(int* a, int* b) {return (*a > *b) ? a : b;
}int main() {int x = 10, y = 20;// 调用指针函数find_max,返回x和y中较大的那个数的地址int* max_ptr = find_max(&x, &y);printf("The max value is: %d\n", *max_ptr);return 0;
}

10.函数指针

函数指针用来存放函数的地址,这个地址是一个函数的入口地址
函数名代表了函数的入口地址
函数指针变量说明的一般形式如下:
<数据类型> (*<函数指针名称>) (<参数说明列表>);

#include <stdio.h>// 定义一个返回int类型,接受两个int参数的函数
int add(int a, int b) {return a + b;
}int main() {// 声明一个函数指针,指向接受两个int参数并返回int类型的函数int(*func_ptr)(int, int);// 将函数指针指向add函数func_ptr = add;// 通过函数指针调用add函数printf("The result is: %d\n", (*func_ptr)(3, 4));getchar();return 0;
}

函数指针的声明方式是先声明返回类型,然后是函数指针变量名,再跟随函数的参数类型。

这个地方可以结合指针数组一起使用,相应的指针数组如下所示:

#include <iostream>
using namespace std;int main() {// 定义一个指针数组,能够存储5个int类型的指针int* ptrArray[5];// 定义一些整数int a = 10, b = 20, c = 30, d = 40, e = 50;// 将每个整数的地址赋值给指针数组中的元素ptrArray[0] = &a;ptrArray[1] = &b;ptrArray[2] = &c;ptrArray[3] = &d;ptrArray[4] = &e;// 通过指针数组输出各个整数的值for (int i = 0; i < 5; i++) {cout << "Value of ptrArray[" << i << "]: " << *ptrArray[i] << endl;}return 0;
}

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

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

相关文章

AI工具 GPT 学术优化 (GPT Academic) 安装实践

GPT 学术优化 (GPT Academic)是一个综合的AI GPT工具包&#xff0c;可以完成各种gpt辅助的工作&#xff0c;比如代码解读、翻译、读论文等功能。官网&#xff1a;GitHub - binary-husky/gpt_academic: 为GPT/GLM等LLM大语言模型提供实用化交互接口&#xff0c;特别优化论文阅读…

2024年中国运筹学会运筹竞赛(数据驱动赛道)报名通知

竞赛组织 主办单位&#xff1a;中国运筹学会&#xff08;国家一级学会&#xff09; 承办单位&#xff1a;中国科学技术大学 支持单位&#xff1a;杉数科技、海康威视、中国科学技术大学管理学院、《运筹学学报》杂志 竞赛内容 本次竞赛&#xff08;本科生组&#xff09;由竞…

BOSS直聘财报:2024年第二季度净利润4.17亿元,同比上涨34.8%

8月28日美股盘前&#xff0c;BOSS直聘&#xff08;NASDAQ:BZ,HK:2076&#xff09;发布了2024年第二季度财报。在第二季度&#xff0c;公司经营效率不断提升&#xff0c;非通用会计准则下&#xff0c;取得净利润4.17亿元&#xff0c;同比上涨34.8%。 第二季度&#xff0c;公司持…

实习结束总结20240828

长达两个月的实习终于在今天结束了&#xff0c;不知怎的&#xff0c;心如止水&#xff0c;没有高兴&#xff0c;没有伤心&#xff0c;毫无波澜的内心甚至让自己都感觉可怕&#xff0c;也许&#xff0c;这就是成长吧。 硬件上&#xff1a; 1.cadence需要继续深入学习&#xff…

深圳保障房、商品房、小产权房子类型对比

摘要&#xff1a; 整理了我认知以内的深圳房子类型&#xff0c;有安居房&#xff0c;可售人才房&#xff0c;共有产权房、配售型保障房、商品房、统建楼、农民房的区别。如果数据存疑&#xff0c;可以多方对比论证&#xff0c;我也主要靠百度。 我发现我很多同事是非深户&#…

JS WebSocket 深度解析

JS WebSocket 深度解析 文章目录 JavaScript WebSocket 深度解析一、WebSocket 是什么二、JS 中如何使用 WebSocket1. 创建 WebSocket 对象2. 连接打开事件3. 监听消息事件4. 监听错误事件5. 关闭连接 三、WebSocket 包含哪些属性或方法 API1. 属性2. 方法 四、扩展与高级技巧1…

结果一。5.be doing表将来和 表 will的区别

be doing 表⽰近期、眼下就要发⽣的事情; will 表⽰将来的时间,则较远⼀些。如: He is going to write a letter tonight.He will write a book 。 be going to 表⽰根据主观判断将来肯定发⽣的事情。 will+ 动词原形表⽰⼀般将来时。 will ࿰

【xilinx】米联客ZYNQ MZ7100自学发现JTAG烧写失败

3-2-01米联客 2022 版 ZYNQ SOC SDK 入门篇 02 程序固化入门(SDK 方式) 生成了boot.bin 2.4.2 程序通过jtag烧不进去卡在performing erase operation 最终发现是spi的flash type 模式设置错误&#xff0c;文档和板卡没对应上 文档写的qspi-x4-single 实际用的qspi-x8-dual_par…

16:9横屏短视频素材库有哪些?横屏短视频素材网站分享

在当今这个视觉为王的时代&#xff0c;16:9横屏视频凭借其宽阔的画面和卓越的观看体验&#xff0c;已经成为许多视频创作者和营销专家的首选格式。如果你想制作出引人注目的横屏视频&#xff0c;选择高质量的视频素材库是关键。无论你是视频制作的老手还是刚入行的新手&#xf…

免费分享一套SpringBoot+Vue个人理财管理系统【论文+源码+SQL脚本】,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue个人理财管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringbootVue个人理财管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着信息技术在管理上越来越深入而广泛的应用&am…

【图像去噪】论文复现:代替ReLU!Pytorch实现即插即用激活函数模块xUnit,并插入到DnCNN中实现xDnCNN!

请先看【专栏介绍文章】&#xff1a;【图像去噪&#xff08;Image Denoising&#xff09;】关于【图像去噪】专栏的相关说明&#xff0c;包含适配人群、专栏简介、专栏亮点、阅读方法、定价理由、品质承诺、关于更新、去噪概述、文章目录、资料汇总、问题汇总&#xff08;更新中…

文章生成用这三款伪原创软件效果好

在当今信息爆炸的时代&#xff0c;无论是网站运营者、博主、作家还是学生&#xff0c;对文章的需求量越来越大。他们需要用大理的的原创文章来满足他们工作需求。然而&#xff0c;对于许多人来说&#xff0c;写作一篇优质的文章并非易事。这就产生了一种需求&#xff0c;那就是…

3 Python开发工具:VSCode+插件

本文是 Python 系列教程第 3 篇&#xff0c;完整系列请查看 Python 专栏。 Visual Studio Code的安装非常简单&#xff0c;就不放这里增加文章篇幅了。 相比PyCharm&#xff0c;VSCode更加轻量&#xff0c;启动速度快。并且搭配Python插件就能实现和Pycharm一样的代码提示、高…

如何将平淡无奇的产品推向市场?借助ChatGPT,仅需3秒即可化身短视频创意策划大师,助你的产品一夜成名!

毫无趣味的产品要如何宣传&#xff1f;用ChatGPT&#xff0c;3秒钟成为创意短视频策划高手&#xff0c;让你的产品出圈&#xff01;© 由 ZAKER 提供 最近&#xff0c;全红婵最爱的小乌龟火了。 制作小乌龟的某位义乌商家在接受采访时&#xff0c;表示自己有了甜蜜的烦恼…

力扣刷题(2)

寻找两个正序数组的中位数 寻找两个正序数组的中位数-力扣 思路: 合并两个正序数组找中位数 double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {int arr[nums1Size nums2Size];int n1 0, n2 0;int m 0;int q;//合并两个正序数组w…

Git 远程操作

1. 理解分布式版本控制系统 我们所说的⼯作区&#xff0c;暂存区&#xff0c;版本库等&#xff0c;都是在本地&#xff01;也就是在笔记本或计算机上。⽽我们的 Git 其实是分布式版本控制系统.可以简单理解为&#xff0c;我们每个⼈的电脑上都是⼀个完整的版本库&#xff0c;这…

Java 中的抽象工厂模式:优雅地掌握对象创建

文章目录 一、概述三、抽象工厂设计模式的意图四、抽象工厂模式的详细解释及实际示例五、Java 中抽象工厂模式的编程示例六、抽象工厂模式类图七、Java 中何时使用抽象工厂模式八、抽象工厂模式 Java 教程九、抽象工厂模式的优点和权衡十、Java 中抽象工厂模式的实际应用十一、…

【Web UI自动化测试】Web UI自动化测试之框架篇(全网最全)

本文大纲截图&#xff1a; UnitTest框架&#xff1a; PyTest框架&#xff1a; 框架&#xff1a; 框架英文单词 framework&#xff0c;为解决一类事情的功能的集合。需要按照框架的规定&#xff08;套路&#xff09;去书写代码。 一、UnitTest框架介绍【文末分享自动化测试学…

使用canal增量同步ES索引库数据

Canal增量数据同步利器 Canal介绍 canal主要用途是基于 MySQL 数据库增量日志解析&#xff0c;并能提供增量数据订阅和消费&#xff0c;应用场景十分丰富。 github地址&#xff1a;https://github.com/alibaba/canal 版本下载地址&#xff1a;https://github.com/alibaba/c…

鸿蒙开发:深入浅出Stage模型(UIAbility组件)

&#x1f680;一、UIAbility组件 &#x1f50e;1.概述 HarmonyOS中的Stage模型是一种基于UIAbility组件的应用程序架构。UIAbility是HarmonyOS系统中用于构建用户界面的基本组件之一。它负责处理应用程序界面的显示和交互。 在Stage模型中&#xff0c;每个应用程序都有一个或…