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

C语言---指针进阶

1.字符指针

int main()
{char str1[] = "hello world";char str2[] = "hello world";const char* str3 = "hello world.";const char* str4 = "hello world.";if (str3 == str4){//常量字符串在内存里面是无法修改的,所以没必要存//2分,因为都无法改变printf("same\n");}else{printf("not same\n");}return 0;
}

(1)这里面的str3和str4就是字符指针,简而言之,字符指针就是存放字符的指针;

(2)字符指针变量指向的是首个字符的地址;

(3)上面的程序打印的结果就是same,因为加上const之后就是常量字符串,无法进行修改,所

以在内存里面不用存2份,因为反正也无法改变,所以他们的地址是相同的;

(4)str1和str2地址是不相同的,因为str1和str2是两个不同的数组,内存里面会分别给2个数组开

辟空间,所以他们的地址是一定不相同的;

2.指针数组

(1)这个先定义了3个数组,分别是arr1[],arr2[],arr3[],

(2)整形数组就是全是整数的数组,字符数组就是全是字符的数组,指针数组毫无疑问就是存放指针的数组,arr4就是一个指针数组,里面放着定义的三个数组的地址;

(3)这个是使用指针数组模拟实现二维数组,通过arr4[i]找到对应的数组的地址,

arr4[i][j]就是找到数组里面对应的元素的地址;如下图所示

3.数组指针

int (*p) arr4就是数组指针;

(1)数组名是数组首个元素的地址,但是有2个例外

------->一个是&(数组名),这里的数组名是整个数组,求的是这个数组的地址;

-------->另外一个是sizeof(数组名),这里的数组名是整个数组,求的是数组的大小,单位字节;

(2)通过一个例子带你走进数组指针

arr+1就是跳过一个元素,所以相差4C-48=4个字节;

&arr+1就是跳过一个数组,所以相差95C-948=20个字节;

虽然数组的地址和首个元素的地址指向的位置一样,但是他们的类型不一样;

我们引入数组指针就是为了存放数组的地址,数组指针是这样表示的;

4.数组指针的使用

(1)二维数组的传参实际上传递的是地址

void Print(int(*p)[5], int r, int c)
{int i = 0;int j = 0;for (i = 0; i < 3; i++){for (j = 0; j < 5; j++){printf("%d ", *(*(p + i) + j));}printf("\n");}
}
int main()
{int arr[3][5] = { 1,2,3,4,5,2,3,4,5,6,3,4,5,6,7 };Print(arr, 3, 5);return 0;
}

我们可以把一个二维数组理解成为3个一维数组组合而成的,第⼀⾏的⼀维数组的类型就是 int [5] ,所以第⼀⾏的地址的类 型就是数组指针类型 int(*)[5];

传参传递的是一维数组的地址;

由此可见:⼆维数组传参,形参的部分可以写成数组,也可以写成指针形式。

相关文章:

  • 世界顶级名校计算机专业,都在用哪些书当教材?
  • Java安全 URLDNS链分析
  • 函数——递归3(c++)
  • ChatGPT-01 用ChatGPT指令,自学任何领域的系统知识
  • 设计模式之:状态模式(State Pattern)
  • R语言【base】——nrow(),ncol(),NCOL(),NROW():返回数组的行数/列数
  • 如何解决缓存和数据库的数据不一致问题
  • Spring Boot 笔记 012 创建接口_添加文章分类
  • VueCLI核心知识3:全局事件总线、消息订阅与发布
  • pytorch神经网络入门代码
  • 最优字符串分隔符:零宽度空格和字符
  • 从宏观到微观——泽攸科技ZEM系列台式扫描电子显微镜在岩石分析中的应用
  • SpringBoot常见问题
  • firewall防火墙配置实战
  • 宝塔nginx配置SpringBoot服务集群代理
  • hexo+github搭建个人博客
  • [译]CSS 居中(Center)方法大合集
  • Apache的80端口被占用以及访问时报错403
  • es的写入过程
  • Intervention/image 图片处理扩展包的安装和使用
  • JavaScript中的对象个人分享
  • Kibana配置logstash,报表一体化
  • magento 货币换算
  • MaxCompute访问TableStore(OTS) 数据
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • nginx 负载服务器优化
  • Python打包系统简单入门
  • React16时代,该用什么姿势写 React ?
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • 高度不固定时垂直居中
  • 观察者模式实现非直接耦合
  • 机器学习中为什么要做归一化normalization
  •  一套莫尔斯电报听写、翻译系统
  • - 转 Ext2.0 form使用实例
  • 自定义函数
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • ​ssh免密码登录设置及问题总结
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #1014 : Trie树
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (06)Hive——正则表达式
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (MATLAB)第五章-矩阵运算
  • (zhuan) 一些RL的文献(及笔记)
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (论文阅读40-45)图像描述1
  • (一)为什么要选择C++
  • (转)Linux整合apache和tomcat构建Web服务器
  • *上位机的定义
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .naturalWidth 和naturalHeight属性,
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .NET Core中的去虚