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

        今天学习了指针,指针吧理解有点小难,慢慢分析就懂。

在开始学指针之前先回顾一下C语言的数据类型如下图所示:

按照分类分别为:

        1->基础数据类型:char ;short; int; long; float; double。

        2->构造类数据类型:数组;指针;结构体;共用体;枚举;

一 指针

接下来开始介绍指针:

指针:仅仅是一种数据类型该数据类型专门用来存放地址;

1.1指针的定义:

        格式:数据类型         *变量名

        数据类型:指针指向的空间的数据类型;        

                          指针里面存放谁的地址,就称为指针指向谁。

也就可以理解为:指针指向的空间的数据类型        *变量名

举例说明:

int num;

int *p =#

        首先定义一个整形变量名为num,整形变量的存在计算机会为它开空间,而这个空间就是用来存储这个整形变量的地址。所以可以解释为:p里面用来存放num的地址,然后被叫为p指向num。

那么其中的各个部分对应是什么东西了?

其中:int*p

p的数据类型为:int*,为什么p的数据类型是int*而不是int了?

因为判断一变量的数据类型的规则是去掉变量名剩下的全都是它的数据类型。

而其中的int:是指p所指向的空间数据类型。在这里也就是前面定义的整形num。

1.2指针的大小

指针的大小为:固定8字节

比如:

        int *p; char *p;double *p,这三个指针的大小是多少了?

用代码验证一下:

#include<stdio.h>
int main()
{int num =100;int *p =&num;double Num=0;double *q=&Num;char ann='a';char *w =&ann;printf("%d\n",sizeof(p));printf("%d\n",sizeof(q));printf("%d\n",sizeof(w));return 0;} 

运行结果:

由此可见不论定义什么类型的指针,其数据类型固定位八个字节。

1.3指针的用法

①一般用法

int num =100;

int *p = &num;

②int *p = NULL; //NULL 是 0 号地址;
 

#include<stdio.h>
int main()
{int num =100;int *p =&num;printf("%d\n",num);printf("%d\n",*p);printf("%p\n",p);return 0;} 

运行结果

插入:&号

怎么理解了?

比如:

        int num;        char ch;        int *p;

        &num: int*        &ch:char*        &p:int **

简明的理解为:使用&后,对应的数据类型加一个 *

注意:只能对变量取地址;如果对常量进行取地址就会报错。

1.4 解指针

格式:*变量名;

解释:通过地址,操作指针指向的空间;

比如:

        int num=200;

        int *p=&num;

        printf("%d",*p);

p 里面存放 num 的地址, 叫做 p 指向 num, 则*p 就是得到 num 的空间.如上图说标注。

1.5 野指针

int*p;        //局部变量--p里面存的是随机数

注意:虽然*p = 200; //不报错! ! 但是不能做! !(避免出现野指针)

1.6指针的偏移

指针的加减:指针的加减以指针指向的空间大小为单位

int num=100;        num+=1;        num=101;

int *p=NULL;           p++;                   p=Ox4

char*q=NULL          q++;                   q=Ox1

代码验证:

#include<stdio.h>
int main()
{int num =100;int *p=NULL;char *q=NULL;num +=1;printf("%d\n",num);p++;printf("%d\n",p);q++;printf("%d\n",q);return 0;} 

运行结果:

使用10进制的输出:

使用%p查看16位的地址

为什么会这样了?

可以看到第一个是整形变量在有具体值之后使用变量偏移就是直接加减。第二个同样是整形,而对于指针来说,其是以指向的空间大小为单位,我的理解就是在处理指针偏移时,处理的是一位属于类型,也就比如说是处理int型数据的指针,移动一场,就是对应的数据类型的位数,比如int型,是四个字节,移动一次就是移动了四个字节,char是一个字节,所以移动后的数是1.

二 二级指针

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

一般方法:

int num=100;

int *p = &num;//这是一级指针

int **q = &p;q二级指针

怎么理解这三行了。

翻译过来就是,定义了一个整形变量名为num,然后定义了一个指针指向它,用来存储它的地址,那么也就是说指针p也是有地址的,有地址就可以继续存储,定义了一个二级指针,用来存储一级指针的地址。这就是二级指正,那么三级,四级,,,皆是如此。

#include<stdio.h>
int main()
{int num =100;int *p=&num;int **q = &p;//打印num的值printf("num=%d\n",num);printf("*p=%d\n",*p);printf("**q=%d\n",**q);/*这三个值是相同的,因为*p存储的是num的地址,**q存储的是*p的值,所以这三个值相同*/	//打印p的值printf("&num=%p\n",&num);printf("p=%p\n",p);printf("**q=%p\n",*q);//打印q的值printf("q=%p\n",q); printf("&p=%p\n",&p);return 0;} 

运行结果;

由上面的代码和输出结果不难看出:num的地址信息是存储在*p中,*p放在**q中。而单独的p是存储的地址。

指针偏移: 以指针指向的空间大小为单位偏移(二级指针, 指向的空间均为指
针, 因此二级指针的指针偏移统统以 8 为单位)
int **p = NULL;                 char **a = NULL;
p++;                                  a++;
0x8                                      0x8

二级指针的偏移和一级指针有所不同,一级指针作用于指向的数据类型,以指向的数据类型为单位,进行偏移,而二维指针指向的是上一个一级指针,而指针的数据类型固定是八位,所以为以后的值为8.

好了今天的笔记到此介绍,已经分享一张我喜欢的图片吧。

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

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

相关文章

【数据结构】树tree

树的遍历 广度遍历Breadth-first traversal Breadth-first traversal is the traversal strategy used in the binary tree.Breadth first traversal, also known as level order traversal is the traversal strategy used in a binary tree. It involves visiting all the …

短视频矩阵系统---开发源头交付

短视频矩阵系统---开发源头交付 短视频矩阵系统的核心开发步骤包括以下几个方面&#xff1a; 1. 系统设计&#xff1a;根据需求分析&#xff0c;设计出相应的系统架构&#xff0c;包括数据库设计、系统功能模块设计等。 2. 开发基础功能&#xff1a;基础功能包括短视频的上传、…

el-select的错误提示不生效、el-select验证失灵、el-select的blur规则失灵

发现问题 在使用el-select进行表单验证的时候&#xff0c;发现点击下拉列表没选的情况下&#xff0c;他不会提示没有选择选项的信息&#xff0c;我设置了rule如下 <!--el-select--><el-form-item label"等级" prop"level"><el-select v-m…

从供方协议管理到外部供方管理

从GJB 5000A的供方协议管理到GJB 5000B的外部供方管理&#xff0c;军用软件的研制对承接单位有了更高的标准和要求&#xff0c;也对外部供方管理有了更改的要求&#xff0c;让我们看看具体的变化吧&#xff01; 供方协议管理的目的&#xff1a; 管理供方产品的获取工作。 外部…

linux下minio部署和nginx配置

1 下载minio wget https://dl.min.io/server/minio/release/linux-amd64/minio chmod x minio #启动minio&#xff0c;文件数据存放在/data目录 ./minio server /data2 部署minio 下载minio后赋予可执行权限就可以运行了&#xff0c;这里我整理了遇到的坑和解决问题的最终配置…

快速上手Spring Cloud 九:服务间通信与消息队列

快速上手Spring Cloud 一&#xff1a;Spring Cloud 简介 快速上手Spring Cloud 二&#xff1a;核心组件解析 快速上手Spring Cloud 三&#xff1a;API网关深入探索与实战应用 快速上手Spring Cloud 四&#xff1a;微服务治理与安全 快速上手Spring Cloud 五&#xff1a;Spring …

AIS板评测 dAI01-OEM

目录 一、设备概述 二、技术性能评测 三、总结 一、设备概述 dAI01-OEM是一款AIS接收机板卡&#xff0c;旨在与OpenCPN、Ship Plotter等能够接收串口数据输入的软件实现无缝配合。它不仅能够高效接收并处理AIS信号&#xff0c;还能够将本船的信息实时上传到MarineTraffic和…

MySql实战--MySQL为什么有时候会选错索引

前面我们介绍过索引&#xff0c;你已经知道了在MySQL中一张表其实是可以支持多个索引的。但是&#xff0c;你写SQL语句的时候&#xff0c;并没有主动指定使用哪个索引。也就是说&#xff0c;使用哪个索引是由MySQL来确定的。 不知道你有没有碰到过这种情况&#xff0c;一条本来…

用Python实现办公自动化(自动化处理Excel工作簿)

自动化处理Excel工作簿 &#xff08;一&#xff09;批量生产产品出货清单 以“出货统计表”为例&#xff0c; 需求&#xff1a;将出货记录按照出货日期分类整理成多张出货清单 “出货统计表数据案例” “产品出货清单模板” 1.提取出货统计表的数据 “Python程序代码” # 使用…

Topaz Gigapixel AI for Mac 图像放大软件

Topaz Gigapixel AI for Mac是一款专为Mac用户设计的智能图像放大软件。它采用了人工智能技术&#xff0c;特别是深度学习算法&#xff0c;以提高图像的分辨率和质量&#xff0c;使得图像在放大后仍能保持清晰的细节。这款软件的特点在于其能够将低分辨率的图片放大至高分辨率&…

基于微信小程序的校园服务平台设计与实现(程序+论文)

本文以校园服务平台为研究对象&#xff0c;首先分析了当前校园服务平台的研究现状&#xff0c;阐述了本系统设计的意义和背景&#xff0c;运用微信小程序开发工具和云开发技术&#xff0c;研究和设计了一个校园服务平台&#xff0c;以满足学生在校园生活中的多样化需求。通过引…

“51媒体”线下活动,媒体线上同步直播的好处,有哪些资源?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 线下活动媒体线上同步直播的好处以及可利用的资源如下&#xff1a; 好处&#xff1a; 扩大影响力&#xff1a;通过媒体线上同步直播&#xff0c;活动可以覆盖更广泛的受众群体&#xff…