学习笔记——C语言基本概念指针(下)——(8)

1.指针和数组

        数组指针 -- 指向数组的指针。

        指针数组 -- 数组的元素都是指针。

换句话理解就是:数组指针就是个指针,指针数组就是个数组。

  

1.1数组指针

数组指针:指向数组的指针;

先回顾一下数组的特点:
        1.相同数据类型的若干个元素

        2.元素的地址空间连续

        3.数组名是数组的首元素地址,也是整个数组的首地址。

1.1.1 指针指向一维数组

int num[6]={1,2,3,4,5,6};

先定义一个整形的数组名字为num,其中有6个元素。

回顾一下指针的定义: 指针指向的空间类型 *变量名

int *P=num;        单独的数组名仅仅表示首元素的地址,p指向首元素,所以指针指向的空间数据类型就是首元素类型。

举例说明:
int num[6] = {1,2,3,4,5,6}

int *p =num;

        p:存放的是首元素的地址;        *p得到的是num[0];

在这里我的理解就是,指针指向的是数组的首元素,也就是存放的是首元素的地址,而使用*号就是对这个指针进行解码操作,得到里面的信息,也就是对应数数组的第一个元素num[0].

        p的数据类型是:int *。

我的理解就是:根据定义,p指针指向的空间类型,换句话说就是,指针p后面跟的是谁,它是什么数据类型,那么p所指向的数据类型就是什么,那为什么p的数据类型是int *?因为更具数据类型判断的定义,去掉变量名剩下的全是数据类型所以是int *

        p+1操作,是以int为单位的+1,一个int是四个字节。 *(p+3)得到的就是num[3]:4。

那为什么会是这样的了?p指针是指向地址,p的偏移是在对应地址空间中进行,回顾指针的定义,指针元素是具有连续性。也就是说在现在这个存储的num[6]数组中,第0个元素和第一个元素之间是相差四个字节的,也就可以推出,当p以int为单位偏移3时,移动的是12个字节,每两个元素之间但是相差4字节。所以在对(p+3)进行解码时得到的是num[3]。

同理在进行数组取元素:num[4] = *(p+4)         *(num+4)==num[4]        p[4]==*(p+4)

         在库函数中指针的应用:

strlen(数组名); //数组名是首元素地址
strlen(char *s);

举例:

#include<stdio.h>
#include <string.h>
int main()
{char buf[32] = {"hello"};char *p = NULL;p = buf; //buf -- 首元素地址 &buf[0]scanf("%s",buf); //buf 是首元素地址这个性质printf("%s",p);return 0;	
} 

运行结果为你随意输入,然后输入的内容中会被指针p指向首元素地址,然后从这里开始依次写入。

补充:

int num[6] = {1,2,3,4,5,6};
int(*p)[6]=&num;

其中&num是整个数组的首地址,p指向的空间类型就是整个数组的类型。

p:指针        int(*)[6]

p指向的空间类型:int[6]

p+1        以6个int为单位+1

总结: int num[6];
        单独的数组名, num: 表示首元素地址
        &数组名, &num: 表示整个数组的首地址 ( 很少用! )
        区别:
                %p 打印 num 和&num 数值一样
                区别在于: &num+1 以 int [6] 为单位+1
                num + 1 以元素大小即 int 为单位+1

1.1.2指针指向二维数组

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

在回指针的定义来看:指针指向的空间数据类型 * 变量名;

int(*p)[4]=num;

单独的数组名仅仅表示元素地址,p指向首元素,p指向的空间类型就是首元素类型;二维数组的首元素为num[0],类型是int[4],因此p指向的空间类型就是int[4]

打印 7: num[1][2]         *(*(p+1)+2)         p[1][2]         *(*(num+1)+2)
通式:
                num[i][j]           *(*(p+i)+j)            p[i][j]           *(*(num+i)+j)

1.2 指针数组

指针数组:数组的元素全是指针。

数值:元素的数据类型  变量名[元素个数];

举例说明:

char *s[4]={“hello”,“dbase”,“123”,“world”

s[0]: char * “hello”的首地址
s[1]: char * “dbase”的首地址
。 。 。
定义指针:指针指向数组,一维数组

指针指向的空间类型 *变量名;

char **p=s;//s数组名,数组的首地址。

        p指向数组的首元素,数组的首元素是char*

        指针指向的空间类型就是char*;

代码示例:

#include<stdio.h>
int main()
{char*a[]={"Pascal","Clanguage","dBase","Coble"};char (**p);int j;p = a + 3;for(j = 3; j >= 0; j--)printf("%s\n", *(p--));} 

运行结果为:

数组的元素是指针: char * ptr[5] = {NULL};
这个一般用的不多,就不多介绍了。

2 C语言的五大区

栈区: 局部变量(自动开辟, 自动释放);
堆区: 预留给开发人员, 需要手动开辟 malloc, 手动释放 free;
全局区/静态区: 全局变量和静态变量(static)
常量区: 存放常量, 不能改变的量;
代码段: 存放二进制代码


3. 总结指针的定义


1--》 char *p = NULL;
2--》 char ch;
        char *p = &ch;
3--》 char buf[32] = {“hello”};//局部变量--“ hello” 栈区
        char *p = buf;
        小写的 e 改为 E
        buf[1] = ‘E’ *(p+1)=’E’;
4--》 用字符串初始化一个指针
        char *p = “hello”;//局部变量 -- p 有空间, 8 字节
        //p 里面存放的是常量区”hello”的首地址
        *( p+1) 打印出 ‘ e’
        想小写的 e 改为 E *(p+1)=’E’; //报错, 常量区不能被修改
5--》 char buf[3][80] = {0};
        char (*p)[80] = buf;

4 const

含义: 修饰变量, 使其只读
位置: 定义变量的时候
1--> const int num = 100; //const 修饰 num, num 只读
num = 200;//报错
2--> int num = 100;
const int *p = # //const 修饰*p, 仅仅不能通过 p 来修改 p 指向的空间的内容
3--> int num = 100;
int const *p = # //同 2》
4--> int num = 100, a = 200;
int *const p = # //const 修饰 p, p 的指向不能改变
p = &a; //报错
5--> int num = 100, a = 200;
const int *const p = #
第一个 const 修饰*p: 不能通过 p 改变 p 指向空间的内容
第二个 const 修饰 p, p 的指向不能改变;

关于指针的内容就分享到这里,其中大多数是我自己的理解如果有错误的地方,请在评论区指出。

今天依旧分享一张图片当结束吧。


 

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

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

相关文章

【C语言】联合体、枚举: 联合体与结构体区别,枚举的优点

目录 1、联合体 1.1、什么是联合体 1.2、联合体的声明 1.3、联合体的特点 1.4、联合体与结构体区别 1.5、联合体的大小 2、枚举 2.1、枚举类型的声明 2.2、枚举类型的优点 3、三种自定义类型&#xff1a;结构体、联合体、枚举 正文 1、联合体 1.1、什么是联合体 联…

如何使用route-detect在Web应用程序路由中扫描身份认证和授权漏洞

关于route-detect route-detect是一款功能强大的Web应用程序路由安全扫描工具&#xff0c;该工具可以帮助广大研究人员在Web应用程序路由中轻松识别和检测身份认证漏洞和授权漏洞。 Web应用程序HTTP路由中的身份认证&#xff08;authn&#xff09;和授权&#xff08;authz&…

题目:小明的背包5(蓝桥OJ 1178)

问题描述&#xff1a; 解题思路&#xff1a; 分组背包模板题&#xff0c;与优化01背包的不同之处在于第一维不可省略&#xff0c;要写s循环。注意要初始化 #include <bits/stdc.h> using namespace std; const int N 1e3 9; int dp[N][N]; // 分组背包模板&#xff0c;…

代码随想录阅读笔记-二叉树【平衡二叉树】

题目 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a;一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 示例 1: 给定二叉树 [3,9,20,null,null,15,7] 返回 true 。 示例 2: 给定二叉树 [1,2,…

ZKFair 创新之旅,新阶段如何塑造财富前景

在当前区块链技术的发展中&#xff0c;Layer 2&#xff08;L2&#xff09;解决方案已成为提高区块链扩容性、降低交易成本和提升交易速度的关键技术&#xff0c;但它仍面临一些关键问题和挑战&#xff0c;例如用户体验的改进、跨链互操作性、安全性以及去中心化程度。在这些背景…

Unity中UI系统1——GUI

介绍 工作原理和主要作用 基本控件 a.文本和按钮控件 练习&#xff1a; b.多选框和单选框 练习&#xff1a; 用的是第三种方法 c.输入框和拖动框 练习&#xff1a; 练习二&#xff1a; e.图片绘制和框 练习&#xff1a; 复合控件 a.工具栏和选择网格 练习&#xff1a; b.滚动视…

纷享销客如何向生态型CRM进化 创始人罗旭给出了答案

自己挣1块钱时&#xff0c;渠道合作伙伴能够挣1块甚至更多。这是纷享销客与生态共建之道。 2024年纷享销客北方战区渠道生态伙伴发展共建会于日前在北京举行。在这场主题为“聚力纷享共赢巅峰”的大会上&#xff0c;各方探讨了企业高质量增长之源与SaaS行业渠道发展之路&#…

云渲染实用工具:3ds max怎么改低版本?

3ds Max是建模领域广泛采用的专业软件&#xff0c;它通过定期更新来不断增强功能和提升性能。但这些频繁的更新有时会导致一些插件暂时无法与新版本完全兼容。为了解决这个问题&#xff0c;设计师们可以采用一个简单有效的方法&#xff0c;那就是将较新版本的3ds Max文件进行版…

基于Unity+Vue3通信交互的WebGL项目发布实践

基于UnityVue3通信交互的WebGL项目发布实践 实践路线 基于UnityVue3通信交互的WebGL项目发布实践问题背景准备工作解决方案项目实践小目标搭建Unity测试项目 创建Vue3测试项目运行项目验证unity和vue通信功能总结与展望 问题背景 我们最近需要把unity开发的pc项目迁移到web端&…

吴恩达深度学习笔记:浅层神经网络(Shallow neural networks)3.9-3.11

目录 第一门课&#xff1a;神经网络和深度学习 (Neural Networks and Deep Learning)第三周&#xff1a;浅层神经网络(Shallow neural networks)3.9 神 经 网 络 的 梯 度 下 降 &#xff08; Gradient descent for neural networks&#xff09;3.10&#xff08;选修&#xff0…

C#让标题栏闪烁着动起来的方法

目录 1.API函数FlashWindow &#xff08;1&#xff09;添加命名空间 &#xff08;2&#xff09;声明DllImport方法 &#xff08;3&#xff09;FlashWindow函数 2.P/Invoke 3.再来一个示例 在Windows系统中&#xff0c;当程序在后台运行时&#xff0c;如果某个窗体的提示信…

环境配置——已解决ModuleNotFoundError: No module named ‘cv2’(python)

一、报错代码 在网上搜到不少用Python处理图形的代码&#xff0c;于是复制别人的代码直接运行却报错&#xff0c;得到的结果却是&#xff1a;已解决ModuleNotFoundError: No module named ‘cv2’。&#xff08;当时心里瞬间凉了一大截&#xff0c;最后顺利解决了&#xff0c;顺…

软考 系统架构设计师系列知识点之云原生架构设计理论与实践(8)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之云原生架构设计理论与实践&#xff08;7&#xff09; 所属章节&#xff1a; 第14章. 云原生架构设计理论与实践 第2节 云原生架构内涵 14.2 云原生架构内涵 关于云原生的定义有众多版本&#xff0c;对于云原生架构的…

脑部肿瘤检测YOLOV8

脑部肿瘤检测&#xff0c;采用YOLOV8训练得到PT模型&#xff0c;然后转换成ONNX&#xff0c;OPENCV调用&#xff0c;支持C/PYTHON/ANDORID开发脑部肿瘤检测YOLOV8

如何在Plesk面板备份网站

本周有一个客户&#xff0c;购买Hostease的Windows虚拟主机&#xff0c;咨询我们的在线客服&#xff0c;询问Windows虚拟主机Plesk面板是否提供备份功能。我们为用户提供教程&#xff0c;用户很快完成了数据备份。在此&#xff0c;我们分享这个操作教程&#xff0c;希望可以对您…

实践笔记-harbor-01搭建(版本:2.9.0)

harbor搭建 1.下载安装包&#xff08;版本&#xff1a;2.9.0&#xff09;2.修改配置文件3.安装4.访问harbor5.可能用得上的命令: 环境&#xff1a;centos7 1.下载安装包&#xff08;版本&#xff1a;2.9.0&#xff09; 网盘资源&#xff1a;https://pan.baidu.com/s/1fcoJIa4x…

多微信聚合聊天神器,让你的社交更高效!

对于那些拥有多个微信号的用户来说&#xff0c;频繁地在不同微信号和设备之间切换既麻烦又容易搞混。这时候&#xff0c;一款多微信聚合聊天神器——微信管理系统应运而生&#xff0c;为我们带来了极大的便利与高效。 下面一起来看看它都有哪些功能吧&#xff01; 1、多微信同…

mybatis plus 的方法有些带填充和逻辑删除,有些又不带

有没有人知道这是怎么个规律。逻辑删除看了下都会自动带上&#xff0c;但是主要是删除和修改方法&#xff0c;有些会按照设置的handler自动填充&#xff0c;有些又不会。有大佬知道吗。

C++ | Leetcode C++题解之第2题两数相加

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {map<int,int> a;//提供一对一的hashvector<int> b(2,-1);//用来承载结果&#xff0c;初始化一个大小为2&#xff0c;值为-1的容…

软文推广4大坑,媒介盒子告诉你

今天媒介盒子来和大家聊聊软文推广中的4个坑&#xff0c;让企业在软文推广过程中少走弯路。 一、 没有目的 在如今这个“内容为王”的时代&#xff0c;对软文推广而言&#xff0c;不管其目的性是增强用户参与度、提升品牌认知度还是促成转化等&#xff0c;但总归一个原则&…