学习笔记——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.rhkb.cn/news/293709.html

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

相关文章

机器学习模型——集成算法

集成学习的定义&#xff1a; 集成学习&#xff0c;顾名思义通过将多个单个学习器集成/组合在一起&#xff0c;使它们共同完成学习任务&#xff0c;以达到提高预测准确率的目的。有时也被称为“多分类器系统 (multi-classifier system)”。 集成学习概述&#xff1a; 集成学习…

Linux中如何修改界面为中文, 设置中文输入法

目录 修改界面为中文方法一方法二方法三(kali中)方法四方法五(kali中) 切换为中文/英文输入法方法一方法二(kali中) 待续、更新中 修改界面为中文 方法一 查看当前系统拥有的中文语言包 locale -a | grep CN zh_CN.utf8 : 简体中文语言包 打开文件locale.conf vi /etc/lo…

ISP-VPN实验

文章目录 ISP-VPN实验一&#xff0c;实验拓扑二、实验要求三、IP规划四、实验配置1、IP配置R1的配置R2的配置R3的配置R4的配置R5的配置 2、配置缺省路由3、认证与被认证配置4、HDLC封装5、构建MGRE和GRE6、整个私有网络基于RIP全网可达7、查看路由配置和PC端配置8、PC端pingR5的…

图扑数字孪生智慧城市,综合治理一屏统览

现代城市作为一个复杂系统&#xff0c;牵一发而动全身&#xff0c;城市化进程中产生新的矛盾和社会问题都会影响整个城市系统的正常运转。智慧城市是应对这些问题的策略之一。领导曾在中央城市工作会议上指出&#xff0c;城市工作要树立系统思维&#xff0c;从构成城市诸多要素…

大模型预测,下一个token何必是文字?

明敏 金磊 发自 凹非寺 量子位 | 公众号 QbitAI 太快了太快了… 大模型的生成技能&#xff0c;已经到了普通人看不懂的境界&#xff01; 它可以根据用户过去5年的体检报告&#xff0c;生成未来第1年、第2年、第3年的体检报告。 你看&#xff0c;这个生成的过程&#xff0c;…

Mybatis-Plus分页查询时碰到`total`有值但`records`为空

个人原因&#xff1a;Mybatis-Plus分页插件设置了maxLimit单页条数 // 分页插件配置 PaginationInnerInterceptor paginationInnerInterceptor new PaginationInnerInterceptor(DbType.MYSQL); paginationInnerInterceptor.setMaxLimit(200L); // 单页分页条数限制(默认无限…

webpack项目打包console git分支、打包时间等信息 exec

相关链接 MDN toLocaleString child_process Node.js strftime 格式 代码 buildinfo.js const { execSync, exec } require("child_process"); // exec: 在 Windows 执行 bat 和 cmd 脚本// execSync 同步 // exec 异步// exec 使用方法 // exec(git show -s,…

Python基础之Class类的定义、继承、多态

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、class类1.类属性操作&#xff08;增删改&#xff09;2.类方法操作 二、类的继承1、语法2、方法重写 二、类的多态 一、class类 、三部分组成 1、类名&#xff…

黑马HTMLCSS基础

黑马的笔记和资料都是提供好了的&#xff0c;这个文档非常适合回顾复习。我在黑马提供的笔记上做了一些微不足道的补充&#xff0c;以便自己复习查阅。该笔记比较重要的部分是 表单&#xff0c;http请求 第一章. HTML 与 CSS HTML 是什么&#xff1a;即 HyperText Markup lan…

使用Pilotfish扩展Sui执行能力

Pilotfish第一个多机智能合约执行引擎&#xff0c;使Sui网络的验证节点可以利用多台机器&#xff0c;并在负载增加时自动扩展以执行更多的交易。这一目标实现不会影响可靠性或功能完整性。 Pilotfish可以从内部执行机器的故障中恢复&#xff0c;并支持Sui的全面动态操作。其流…

分享react+three.js展示温湿度采集终端

前言 气象站将采集到的相关气象数据通过GPRS/3G/4G无线网络发送到气象站监测中心&#xff0c;摆脱了地理空间的限制。 前端&#xff1a;气象站主机将采集好的气象数据存储到本地&#xff0c;通过RS485等线路与GPRS/3G/4G无线设备相连。 通信&#xff1a;GPRS/3G/4G无线设备通…

计算机网络链路层

数据链路 链路是从一个节点到相邻节点之间的物理线路&#xff08;有线或无线&#xff09; 数据链路是指把实现协议的软件和硬件加到对应链路上。帧是点对点信道的数据链路层的协议数据单元。 点对点信道 通信的主要步骤&#xff1a; 节点a的数据链路层将网络层交下来的包添…

Dockerfile和Docker-compose

一、概述 Dockerfile和Docker Compose是用于构建和管理 Docker 容器的两个工具&#xff0c;但它们的作用和使用方式不同。 Dockerfile Dockerfile 是一个文本文件&#xff0c;用于定义 Docker 镜像的构建规则。它包含一系列指令&#xff0c;如 FROM&#xff08;指定基础镜像…

【蓝桥杯第十三届省赛B组】(详解)

九进制转十进制 #include <iostream> #include<math.h> using namespace std; int main() {cout << 2*pow(9,3)0*pow(9,2)2*pow(9,1)2*pow(9,0) << endl;return 0; }顺子日期 #include <iostream> using namespace std; int main() {// 请在此…

安全SCDN的威胁情报库对DDOS防护有什么好处

目前网络攻击事件频频发生&#xff0c;DDoS&#xff08;分布式拒绝服务&#xff09;攻击已成为各种企业&#xff08;小到区域性小公司大到各种跨国公司&#xff09;的主要威胁&#xff0c;DDoS 攻击可能会对企业造成重大损害和破坏&#xff0c;比如对目标公司的业务造成产生不利…

吴晓波频道:构建知识付费领域的数据飞轮

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 知识付费正在完成新阶段的转变。 知识付费的概念可以追溯到 20 世纪 80 年代的彼得德鲁克&#xff0c;他在《后资本主义》一书中提出“知识经济”&#xff0c;指出…

IDEA跑Java后端项目提示内存溢出

要设置几个地方&#xff0c;都试一下吧&#xff1a; 1、默认是700&#xff0c;我们设置大一点&#xff08;上次配置了这儿就解决了&#xff09; 2、 3、 4、-Xmx4g

redolog 和 binlog 的区别以及两阶段提交

最近在学习MySQL架构的时候&#xff0c;关于执行器&#xff0c;存储引擎的具体操作那里&#xff0c;有些地方不是很懂&#xff0c;我仔细思考了一下&#xff0c;发现我对两阶段提交这个过程比较模糊&#xff0c;所以我特意写一篇文章来说一下两阶段提交。 比如说一条更新语句&…

接口自动化框架搭建(九):接入钉钉消息通知

1&#xff0c;jenkins安装钉钉插件 2&#xff0c;在钉钉群聊设置机器人 3&#xff0c;jenkins配置钉钉 根据情况选择&#xff1a; 除了这些&#xff0c;其他不用配置&#xff0c;配置完成点击确认 4&#xff0c;项目配置 添加后保存 5&#xff0c;测试下效果 构建完成后&a…

免费开源的 AI 绘图工具 ImgPilot

免费开源的 AI 绘图工具 ImgPilot 分类 开源分享 项目名: ImgPilot -- 通过提示词及涂鸦生成图片 Github 开源地址&#xff1a; GitHub - leptonai/imgpilot: Turn the draft into amazing artwork with the power of Real-Time Latent Consistency Model 在线地址&#xff…