指针的进阶(C语言)(上)

目录

 

前言

1、字符指针

2、指针数组

3、数组指针

3.1数组指针的定义

3.2 数组名VS&数组名

3.3数组指针的运用


 

前言

        对于指针,我们已经有了初步认识(可以看我写的指针详解那一篇文章)。

简单总结一下基本概念:

        1、指针就是一个变量,用来存放地址,地址唯一标识一块空间。

        2、指针的大小是4/8个字节(32位平台为4字节,64位平台为8字节)

        3、指针是有类型的,指针的类型决定了指针的+-的步长以及指针解引用操作时候计算机如何看待指针所指向的内容。

        4、指针的运算(指针+-常数;指针-指针;指针与指针的比较)

        对于基本概念了解后,现在我们进行指针进阶,对指针进行进一步的深入分析。

1、字符指针

        举例两种用法:

        第一种,指向字符变量,可以操作字符变量。

#include<stdio.h>
int main()
{char ch = "w";char* pc = &ch;*pc = 'b';printf("%c\n", ch);return 0;
}

        还有一种,指向字符串。

#include <stdio.h>
int main()
{const char* p = "abcdef";printf("%s\n", p);return 0;
}

        第二种用指针指向字符串,实际上是把字符串首元素的地址传给了指针变量。而对于常量符串来说,其内容不可被更改,因此用const'修饰*p表示*p的无法更改。

        看一个例子:

        218fac19768241da8d321091fb89cb83.png

        原因:对于常量字符串,放在内存的只读数据区里面,这个空间只能读不能写,只能用不能改变其内容,对于同样的常量字符串,会放在同一个地址,因此p1和p2指向同一个地址,因此p1==p2。

        但是对于arr1和arr2来说,它们是被创建的两个数组,自然会在内存中开辟不同的地址,“abcdef”只不过是对其的初始化而已。所以这两个数组的首元素地址是不同的。

2、指针数组

        是数组,是用来存放指针的数组。

int main()
{int arr1[] = { 1,2,3,4,5 };int arr2[] = { 2,3,4,5,6 };int arr3[] = { 3,4,5,6,7 };int* parr[3] = { arr1,arr2,arr3 };int i = 0;int j = 0;for (i = 0;i < 3;i++){for (j = 0;j < 5;j++){printf("%d ", *(parr[i] + j));}printf("\n");}return 0;
}

        parr就是一个指针数组,它的内部存放了三个地址。

04590e1c381f466c9d300feb26e6d8fe.png

        对每个地址进行访问,就能打印出所有元素的值。其实对于指针数组来讲,它其实是模拟了一个二维数组。访问时可以直接用parr[i][j];效果完全相同。

3、数组指针

        是指针,是指向数组的指针。

3.1数组指针的定义

        int* p1[10];                       p1是指针数组

        int (*p2)[10];                    p2是数组指针

       p2数组指针可以指向一个数组,该数组有10个元素,每个元素是int类型

        要将明白数组指针,必须要先弄懂数组名的概念。

3.2 数组名VS&数组名

        数组名通常表示的是首元素的地址,但是有两个例外:

        1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。

        2.&数组名,这里的数组名表示的依然是整个数组,所以&数组名取出的是整个数组的地址

2f229ab0ea2f4384b1e4d59339de58e4.png

        &数组名从值上来看,和数组名是一样的,都表示了数组首元素的地址,但是,他们的区别是什么?我们都加一看看。

  、a9dfb1c97571497d906dc5711c4c7b81.png

        我们发现,arr加1加了4,而&arr加1加了40。由此我们知道,&数组名之后,它会表示整个数组的地址,+1直接跳过整个数组。

        那么想&arr这样的数据,如果我们想用变量去存放它,我们该用什么变量去存放它呢。答案就是数组指针。“数组指针就是指向数组的指针”,这样我们便理解了这句话。

int(*p2)[10] = &arr;

        这样去定义就能存放&arr,不加括号p2会优先和[]结合成为数组,因此需要用括号将*和p2括起来,确保其是一个指针,后面[]中放的数是arr的元素个数。int指的是arr元素的类型。

3.3数组指针的运用

         b7c35cddf7934d7b940973d268528b57.png

        这是一个运用的例子,有几个要注意的点。1、在定义数组指针时,[]中必须指明数组的元素个数。2、在输出时,一定要将*p用()括起来,不然p会优先和[]结合,变成野指针。

        但是我们一般不这么使用,因为用指针访问数组只需要用*p指向arr就好了。

        数组指针不是应用在这种情况的,数组指针一般运用在二维及以上的数组处理。

1aca081dcdf34b2c8a698305a0ffa00c.png

        这个例子告诉我们,当函数传参时二维数组时,形参可以用数组指针去接收。这样去使用数组指针是最舒适的。

 

        到此,指针进阶(上)结束,后面还有一篇进行讲解,还包括的内容有函数传参如何用指针接收、函数指针、函数指针数组、指向函数指针数组的指针、回调函数。

 

 

 

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

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

相关文章

LeetCode 热题 100 | 二叉树(中下)

目录 1 基础知识 1.1 队列 queue 1.2 栈 stack 1.3 常用数据结构 1.4 排序 2 98. 验证二叉搜索树 3 230. 二叉搜索树中第 K 小的元素 4 199. 二叉树的右视图 菜鸟做题忘了第几周&#xff0c;躺平过了个年TT 1 基础知识 1.1 队列 queue queue<type> q…

【基础】电容降压电路的特点及元器件选择

电容降压电路的特点及元器件选择 在电子制作时&#xff0c;为了减小体积、降低成本&#xff0c;往往采用电容降压的方法代替笨重的电源变压器。采用电容降压方法如元器件选择不当&#xff0c;不但达不到降压要求&#xff0c;还有可能造成电路损坏。本文从实际应用角度&#xf…

比特浏览器bit_selenium3bit_selenium4使用

bit_selenium3 from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver.common.keys import Keys from selenium.webdriver.chrome.options import Options from bit_api import *# /browser/open 接口会返回 selen…

Linux常用操作指令

Linux常用操作指令 ls 指令 语法&#xff1a;ls [选项][目录或文件] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息。 常用选项&#xff1a; -a 列出目录下的所有文件&#xff0c;包括以 . 开头…

RK3568平台 有线以太网接口之MAC芯片与PHY芯片

一.平台网络网络通路 平台有线以太网通路&#xff1a;有线以太网一般插入的是RJ45 座要与 PHY 芯片&#xff08;RTL8306M&#xff09;连接在一起&#xff0c;但是中间需要一个网络变压器&#xff0c;网络变压器经过模数转换后到达网卡(RTL8111)转换为帧数据后到达SOC。 二.网络…

内存计算研究进展-技术架构

内存计算技术是一个宏观的概念&#xff0c;是将计算能力集成到内存中的技术统称。集成了内存计算技术的计算机系统不仅能直接在内存中执行部分计算&#xff0c;还能支持传统以CPU为核心的应用程序的执行。区别于内存计算&#xff0c;存算一体芯片将存储与计算相结合&#xff0c…

【Java基础知识(1)】对象在内存中的存储

Java对象是如何在内存中存储的&#xff1f; 在Java中&#xff0c;所有的对象被动态地分配在堆中。这和C不同&#xff0c;C允许对象被存储在堆或者栈中。 参考Oracle官方文档&#xff1a;官方文档说明 在Java中创建字符串对象的2种方法&#xff1a; 1、 使用String关键字&am…

化学空间可视化(chemical space visualization)开源软件ChemPlot的安装及使用

文章目录 前言一、ChemPlot是什么&#xff1f;二、conda环境安装ChemPlot1. 创建conda环境2. 安装chemplot及需要的包3. 检验安装 三、使用步骤1. 化合物数据库可视化使用方法BBBP数据库的t-SNE降维后可视化&#xff1a;BBBP数据库的PCA降维后可视化&#xff1a;BBBP数据库的UM…

Photoshop 2023(Ps)下载安装及详细安装教程

Photoshop(Ps)的介绍 Adobe Photoshop&#xff0c;简称“PS”&#xff0c;是由AdobeSystems开发和发行的图像处理软件。Photoshop主要处理以像素所构成的数字图像。使用其众多的编修与绘图工具&#xff0c;可以有效地进行图片编辑和创造工作。PS有很多功能&#xff0c;在图像、…

如何用 Moodle 和 ONLYOFFICE 创建在线学习平台

在教学过程中使用现代在线学习软件&#xff0c;已不再是什么稀奇事。在世界各地&#xff0c;越来越多的教师和学生都在使用现代技术&#xff0c;应用新的学习场景&#xff0c;包括学生在传统课堂之外更积极的参与、更密切的互动。 Moodle 支持各类学校和大学充分利用在线教育过…

手持三防平板丨国产化加固平板丨国产三防平板发展的意义是什么?

随着现代科技的快速发展&#xff0c;平板电脑在我们的生活中扮演着越来越重要的角色。然而&#xff0c;传统的平板电脑只能在普通的环境中使用&#xff0c;而无法在恶劣的环境中使用&#xff0c;例如在高海拔、高温、高湿度、沙漠等环境中&#xff0c;传统平板电脑往往会出现故…

MacBook的nginx出现13: Permission denied 的问题分析和解决办法

同样的项目代码&#xff0c;电脑从Windows更换到了MacBook&#xff0c;发现网站的样式都没有了&#xff0c;直接访问CSS文件 http://crm.ms-test.cc/toolstatic/css/bootstrap.min.css 发现无法访问。查看Nginx错误日志&#xff1a; 说明是nginx没有权限访问这个CSS文件&#…