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

news2024/11/26 12:27:37

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

在开始学指针之前先回顾一下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.coloradmin.cn/o/1557243.html

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

相关文章

Platypus 一种集中式的央行数字货币方案

集中式的CBDC&#xff0c;混合使用账户模型和UTXO模型。 角色分类 中央银行&#xff1a;发行货币&#xff0c;交易验证&#xff0c;公开交易日志&#xff0c;防止双花。 不是完全受信任的&#xff0c;假定为会遵守监管要求&#xff0c;但可能会破坏交易隐私&#xff0c;即获…

瑞吉外卖实战学习--5、新增员工功能

新增员工功能 效果图1、开发流程2、页面发送ajax请求,将新增员工的信息以json的形式提交给服务器2.1、在填写信息的时候会发现身份校验比较麻烦,可以在validate中将全局的校验方式去掉,方便填写2.3、看到接口未employee2.4、前端代码分析3、服务器接收到提交的数据并调用ser…

无论PC还是Mac,都能畅快地使用移动硬盘 Mac使用NTFS移动硬盘不能读写

如果你拥有一台Mac设备&#xff0c;总会遇到尴尬的那一刻——你在Mac上用得好好的移动硬盘怎么都不能被PC识别到。又或者你朋友在PC上用得好好的移动硬盘&#xff0c;连上你的Mac后&#xff0c;Mac里的文件死活就是拷贝不进移动硬盘里。这种坑&#xff0c;相信大多数使用Mac的小…

Linux 基于chrony进行时钟同步方案验证

Linux 基于chrony进行时钟同步方案验证 1. 背景介绍2. 验证过程2.1 追踪配置2.2 追平记录2.2 追平时间换算 3. 疑问和思考3.1 如何统计追踪1s需要花费多长时间&#xff1f; 4. 参考文档 chrony是一个Linux系统中用于时钟同步的工具。它使用NTP&#xff08;网络时间协议&#xf…

【Java常用的API】JDK8相关时间类

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

Delphi 12 安卓 部署文件,不支持中文文件名

procedure TForm3.Button1Click(Sender: TObject); var sFileName:string; begin sFileName:TPath.Combine(TPath.GetDocumentsPath,禁止吸烟.wav); showmessage(sFileName); MediaPlayer1.Stop ; MediaPlayer1.FileName: sFileName; MediaPlayer1.Play; end;

c语言:vs2022写一个一元二次方程(包含虚根)

求一元二次方程 的根&#xff0c;通过键盘输入a、b、c&#xff0c;根据△的值输出对应x1和x2的值(保留一位小数)(用if语句完成)。 //一元二次方程的实现 #include <stdio.h> #include <math.h> #include <stdlib.h> int main() {double a, b, c, delta, x1…

商品说明书的制作工具来啦,用这几个就够了!

商品说明书是用户了解产品特性、性能、使用方法的重要途径。一个明确、易懂的商品说明书&#xff0c;可以显著提升用户体验&#xff0c;进而提升产品的销量。但我们都知道&#xff0c;制作一份高质量的说明书并不容易&#xff0c;需要仔细设计、计划和撰写。幸运的是&#xff0…

Python模块与包管理使用pip与virtualenv【第151篇—模块与包管理】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python模块与包管理&#xff1a;使用pip与virtualenv 在Python开发中&#xff0c;模块和包…

【Linux系列】tree和find命令

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

网络性能提升10%,ZStack Edge 云原生超融合基于第四代英特尔®至强®可扩展处理器解决方案发布

随着业务模式的逐渐转变、业务架构逐渐变得复杂&#xff0c;同时容器技术的兴起和逐渐成熟&#xff0c;使得Kubernetes、微服务等新潮技术逐步应用于业务应用系统上。 为了充分释放性能、为业务系统提供更高效的运行环境&#xff0c;ZStack Edge 云原生超融合采用了第四代英特尔…

c语言例题,逐个打印数字

今天来分享个比较简单的程序例题&#xff0c;也是比较经典的一个新手例题&#xff0c;逐个打印输入的数字。我们直接从主函数看起&#xff0c;先定义一个num变量&#xff0c;同时变量的类型是unsigned int&#xff0c;这个类型的意思是无符号的整型变量&#xff0c;unsigned&am…

单链表求集合的交集

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef struct LinkNode {ElemType data;LinkNode* next; }LinkNode, * LinkList; //尾插法建立单链表 void creatLinkList(LinkList& L) {L (LinkNode*)mallo…

嵌入式数据库-Sqlite3

阅读引言&#xff1a; 本文将会从环境sqlite3的安装、数据库的基础知识、sqlite3命令、以及sqlite的sql语句最后还有一个完整的代码实例&#xff0c; 相信仔细学习完这篇内容之后大家一定能有所收获。 目录 一、数据库的基础知识 1.数据库的基本概念 2.常用数据库 3.嵌入式…

2、Cocos Creator 下载安装

Cocos Creator 从 v2.3.2 开始接入了全新的 Dashboard 系统&#xff0c;能够同时对多版本引擎和项目进行统一升级和管理&#xff01;Cocos Dashboard 将做为 Creator 各引擎统一的下载器和启动入口&#xff0c;方便升级和管理多个版本的 Creator。还集成了统一的项目管理及创建…

习题2-5 求平方根序列前N项和

本题要求编写程序&#xff0c;计算平方根序列 的前N项之和。可包含头文件math.h&#xff0c;并调用sqrt函数求平方根。 输入格式: 输入在一行中给出一个正整数N。 输出格式: 在一行中按照“sum S”的格式输出部分和的值S&#xff0c;精确到小数点后两位。题目保证计算结果不…

SD-WAN网络构建要点简述

近年来&#xff0c;SD-WAN已成为企业网络优化的热门选择。SD-WAN代表软件定义广域网&#xff0c;是一种基于软件的网络解决方案&#xff0c;旨在提高企业网络连接的可靠性、安全性和性能。相比传统网络架构&#xff0c;SD-WAN技术通过虚拟化网络通信&#xff0c;利用智能软件和…

ubuntu20.04安装截图工具flameshot

ubuntu20.04 自带的截图工具&#xff0c;可以使用快捷键“shift printScreen” ,但是它不能对截图进行编辑。 现在安装截图工具 flameshot&#xff0c;使用以下命令&#xff1a; sudo apt install flameshot 安装完成后&#xff0c;使用以下命令打开&#xff1a; flamesho…

【实验报告】--基础VLAN

【VLAN实验报告】 一、项目背景 &#xff08;为 Jan16 公司创建部门 VLAN&#xff09; Jan16 公司现有财务部、技术部和业务部&#xff0c;出于数据安全的考虑&#xff0c;各部门的计算机需进 行隔离&#xff0c;仅允许部门内部相互通信。公司拓扑如图 1 所示&#xff0c; …

Android 12系统源码_多窗口模式(一)和多窗口模式相关方法的调用顺序

前言 从 Android 7.0 开始&#xff0c;Google 推出了一个名为“多窗口模式”的新功能&#xff0c;允许在设备屏幕上同时显示多个应用&#xff0c;多窗口模式允许多个应用同时共享同一屏幕&#xff0c;多窗口模式&#xff08;Multi Window Supports&#xff09;目前支持以下三种…