复习:指针

news2024/11/13 9:12:30

目录

指针变量

指针变量的内容

        引入

        指针变量的值 

间接访问操作符

        概念

运算

        基本运算

指针+/-整数

指针-指针 

        引入

         算术运算和间接访问操作

        自增自减运算符

前置 

后置

应用

指针数组 

语法

指针数组

数组指针

多级指针 

引入

语法

章节问题

指针变量

指针变量的内容

        引入

        一个变量的值就是分配给这个变量的内存位置所存储的值。

	int a = 10;
	int* p = &a;
	printf("a = %d p = %p\n", a , p);
	printf("&a = %p &p = %p\n", &a,&p);
//a	= 10				   p = 000000C9AACFF584
//& a = 000000C9AACFF584 & p = 000000C9AACFF5A8

        指针变量的值 

        引用上图,指针变量p的值是变量a的地址,而非变量a的值。

间接访问操作符

        概念

        通过一个指针访问它所指向的地址的过程称为间接访问,用于执行间接访问的操作符是间接访问操作符。

int a = 10;
int* p = &a;
printf("a = %d *p = %d\n", a , *p);
//a = 10 *p = 10

运算

        基本运算

指针+/-整数

        整数在执行加法运算前,会根据指针所指向类型的大小调整偏移的大小。

        (这也是为什么指针在声明时要注明类型

int* p = 10;
char* q = 'a';
printf("%p %p\n", p, p + 1);
printf("%p %p\n", q, q + 1);
//000000000000000A 000000000000000E
//0000000000000061 0000000000000062
指针-指针 

        前提:两个指针都指向同一数组元素时。

        结果:两个指针在内存中的距离(以数组长度为单位,而非以字节为单位)

	int arr[] = { 1,2,3,4,5 };
	int* p = &arr[3];
	int* q = &arr[0];
	printf("%d\n", p - q);
	//4

        引入

        左值:标识了一个可以存储结果值的特定的地点

        右值:指定了一个

	int arr[] = { 0,1,2,3,4 };
	int* p = &arr[0];
	int b;

         算术运算和间接访问操作

	/*指针加法运算的结果:右值.因为它的存储位置并没有清晰定义*/
	printf("*p + 1 = %d\n", *p + 1);/*1*/ /*取得arr[0]值的一份拷贝并把它 + 1*/
	printf("*p = %d\n", *p);		/*0*/ /*arr[0]仍等于0*/

	/*间接访问的结果:左值&&右值.间接访问跟随指针访问一个特定的地址*/
	*p = 1;
	printf("*p = %d\n", *p);		   /*1*//*arr[0]修改为1*/
	printf("*(p+1) = %d\n", *(p + 1)); /*1*//*访问arr[1]的值*/

        自增自减运算符

1.     b = a ++; // b = a , a = a + 1

        b = ++a ; // a = a + 1 , b = a

2.     优先级:自增自减的优先级大于间接访问操作符

前置 
	b = *++p;//p = p + 1, b = *p
	printf(" b = %d,arr[1] = %d\n", b, arr[1]);
	printf(" p = %p,&arr[1]=%p\n", p, &arr[1]);
	// b = 1,				  arr[1] = 1
	// p = 0000003D3E8FF55C, &arr[1] = 0000003D3E8FF55C
后置
	*p++ = 10;/*优先级:* (p++) = 10 1.后置++: * p = 10 2.p = p + 1*/
			  /* *p = &arr[1],arr[0] = 10 */
	printf("%p %p\n", p, &arr[1]); //0000007EC25BF58C 0000007EC25BF58C
	printf("%d\n", arr[0]);		   //10
	b = (*p)++;	/*1.*p = b 2.*p = *p+1*/
				/*   b = 0    arr[0]=1*/
	printf("%d %d\n", b, arr[0]);
	//0 1
应用

        计算一个字符串的长度函数:

int my_strlen(char* string)
{
	int len = 0;
	while (*string++ != '\0')
	{
		len++;
	}
	return len;
}

指针数组 

语法

        <数据类型> * <指针数组名> [ 大小 ];

        注意:辨析指针数组和数组指针。

指针数组

#include<stdio.h>
#pragma warning(disable:4996);
int main()
{
	int arr[3][3] = { {1,2,3},{2,3,4},{3,4,5} };
	int* parr[3] = { arr[0],arr[1],arr[2] };
	int i, j;
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			printf("%d ", *(parr[i] + j));
		}
		putchar('\n');
	}
	return 0;
}

数组指针

#include<stdio.h>
#pragma warning(disable:4996);
int main()
{
	int arr[3][3] = { {1,2,3},{2,3,4},{3,4,5} };
	int(*parr)[3]=arr;
	int i, j;
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			printf("%d ", *(parr[i] + j));
		}
		putchar('\n');
	}
	return 0;
}

多级指针 

引入

一级指针:指向处理数据的指针变量

二级指针:指向一级指针的指针变量

语法

         语法:<数据类型>**<指针名>;

                可以理解为:

                1.<数据类型>*:表示指针的目标。

                2.*<指针名>; :指针变量。

#include<string.h>
#include<stdio.h>
#pragma warning(disable:4996);
int main()
{
	int a = 10;
	int* p = &a;
	int** pp = &p;

	printf("&a = %p   p = %p   pp = %p\n", &a, p, pp);
//&a = 00000034F4D2F694   p = 00000034F4D2F694   pp = 00000034F4D2F6B8
	printf("&a = %p  &p = %p  &pp = %p\n", &a, &p, &pp);
//&a = 00000034F4D2F694  &p = 00000034F4D2F6B8  &pp = 00000034F4D2F6D8
//--------------------结论:p的地址 == qq的值-----------------------
//2.解引用:
	printf("a = %d *p = %d **pp = %d\n", a, *p, **pp);
//a = 10 *p = 10 *pp = 10
	return 0;
}

章节问题

        一级指针、二级指针、数组指针、指针数组是什么? 

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

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

相关文章

Java数据结构(十一)——归并排序、计数排序

文章目录 归并排序算法介绍代码实现非递归实现复杂度和稳定性 计数排序算法介绍代码实现复杂度和稳定性 归并排序 算法介绍 归并排序是一种分而治之的排序算法。基本思想是&#xff1a; 将一个数组分成两半&#xff0c;对每半部分递归地应用归并排序先进行分解&#xff0c;然…

数据权限的设计与实现系列9——前端筛选器组件Everright-filter集成框架开发2

功能实现 ‍ 规则转换为 SQL 片段‍ 规则解析 首先我们来构造一个典型的规则&#xff0c;包括两个条件组&#xff0c;每个组由两个条件组成&#xff0c;由且与或两种逻辑关系&#xff0c;如下图&#xff1a; 然后看看生成的规则&#xff0c;如下&#xff1a; {"filt…

spring中对于servlet API的封装---springWeb

目录 一.springweb概述 二.springweb的特点 三.springweb的运行流程 四.springweb组件 五.springweb的搭建 1.导包 2.配置 DispatcherServlet 3.开启 springweb 注解 4.处理器的搭建 六.springweb注解 七.springweb拦截器 1.拦截器概述 2.拦截器的实现 (1)添加 servelt api 依赖…

开源 AI 智能名片链动 2+1 模式 O2O 商城小程序在社群活动中的应用与时机选择

摘要&#xff1a;本文探讨了开源 AI 智能名片链动 21 模式 O2O 商城小程序在社群经济中的重要性&#xff0c;着重分析了如何借助该小程序适时举办大型活动以维持和引爆社群活跃度。通过对活动时机选择的研究&#xff0c;强调了针对社群用户量身定制活动时机的必要性&#xff0c…

基于python+django+vue的外卖管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的外…

C/C++笔记

C/CPP笔记 杂记 struct msg_train和typedef struct msg_train 大小不一样 cstdio和stdio #include <stdio.h>int main() {printf("Hello, World!\n");return 0; } #include <cstdio>int main() {std::printf("Hello, World!\n");return 0; } 命…

20个Python入门基础语法要点

今天&#xff0c;我们将聚焦于Python的20个基础语法要点&#xff0c;让你的编程之旅更加顺畅。 第一部分&#xff1a;环境搭建与基本概念 1. Hello, World! 你的第一行代码&#xff1a;这是编程旅程的传统起点。 这行代码告诉Python显示文本&#xff0c;print是关键函数&…

常耀斌:AI赋能企业数字化转型(清华社发行)

新书地址&#xff1a; 清华出版社&#xff1a;清华大学出版社-图书详情-《AI赋能企业数字化转型》 京东&#xff1a;《AI赋能企业数字化转型 常耀斌 清华大学出版社 9787302669081》【摘要 书评 试读】- 京东图书 内容简介&#xff1a; 在数字经济时代&#xff0c;企业发…

曲线图如何绘制美观,曲线图10种美化方法

曲线图是比较常用的图形&#xff0c;本文以二维曲线图为例&#xff0c;展示曲线的图的不同美化方法&#xff0c;如图1所示&#xff0c;是一个标准的曲线图&#xff0c;横坐标为x&#xff0c;纵坐标为y, 图1 标准曲线图 调整方法1 首先可以通过改变线的颜色&#xff0c;不同…

从零开始学PostgreSQL (十四):高级功能

目录 1. 简介 2. 视图 3. 外键 4. 事务 5. 窗口函数 6. 继承 7. 结论 简介 PostgreSQL是一个强大且开源的关系型数据库管理系统&#xff0c;以其稳定性、功能丰富性和对SQL标准的广泛支持而闻名。它不仅提供了传统的关系型数据库功能&#xff0c;如事务处理、外键约束和视图&am…

递归基础训练-路径总和

路径总和 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 我们可以把之前的…

【图虫创意-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

R语言统计分析——散点图2(散点图矩阵、高密度散点图)

参考资料&#xff1a;R语言实战【第2版】 1、散点图矩阵 pairs()函数可以创建基础的散点图矩阵。下面代码用于绘制一个散点图矩阵&#xff0c;包含mtcars数据集中的mpg、disp、drat和wt四个变量&#xff1a; pairs(~mpgdispdratwt,datamtcars,main"Basic Scatter Plot M…

输煤传送带异物识别检测数据集 yolo数据集 2400张

输煤传送带异物识别检测数据集 yolo数据集 2400张 输煤传送带异物识别检测数据集介绍 数据集名称 输煤传送带异物识别检测数据集&#xff08;Conveyor Belt Foreign Object Detection Dataset&#xff09; 数据集概述 该数据集专为输煤传送带上的异物识别检测设计&#xff0…

Unity携程Coroutine用法

一.携程概述 官方的解释是&#xff0c;携程允许你可以在多个帧中执行任务。在Unity中&#xff0c;携程是一个可以暂停并在后续帧中从暂停处继续执行的方法。 二.携程写法 下面示例使用携程和Update打印前5帧的时间间隔&#xff0c;展示了携程的基础写法 using System.Colle…

vmware + ubuntu + 初始配置(超级用户权限、vim安装、ssh登陆、共享文件夹、git)

1 VMware Ubuntu下载与安装 下载与安装 2 使用超级用户权限 &#xff08;1&#xff09;执行命令&#xff1a;sudo passwd root 然后在弹出的密码中输入密码即可&#xff0c;具体如下&#xff1a; 第一个密码是当前用户密码 后面两个是root用户密码 //推荐使用一个密码 3 vi…

SEMIDRIVE X9E Flash 调试要点

一、前言 客户采用芯驰 X9E 平台做的 T-BOX 产品&#xff0c;因为客户选用的 Flash 型号不在 SemiDrive_Memory 支持列表里面&#xff0c;出现机器能烧录不能启动的问题。接下来我们对这个问题进行调试。 二、SEMIDRIVE X9E Flash 调试要点 ① 客户的板子 Flash 型号为 GD25LQ…

43集 ESP32 编译调试出错的解决方法汇总

43集 ESP32 编译调试出错的解决方法汇总 1、提示找不到如下头文件&#xff0c;分别对应adf的component #include “esp_peripherals.h” esp_peripherals #include “audio_element.h” audio_pipeline #include “audio_common.h” audio_pipeline 这几个头文件都是esp-adf里…

【全网首发】2024华为OD机试 E卷D卷抽中题库清单(全真题库,持续更新)含考点说明

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;E卷D卷A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加…

Git 原理(提交对象)(结合图与案例)

Git 原理&#xff08;提交对象&#xff09; 这一块主要讲述下 Git 的原理。 在进行提交操作时&#xff0c;Git 会保存一个提交对象&#xff08;commit object&#xff09;&#xff1a; 该提交对象会包含一个指向暂存内容快照的指针&#xff1b; 该提交对象还包含了作者的姓…