C语言小白急救 指针初级讲解(四千字教程)

系列文章目录

C语言小白急救 表达式求值(两千字教程)
C语言小白急救 操作符详解(8千字保姆级教程)
C语言小白急救 扫雷游戏(万字保姆级教程)
C语言小白急救 使用C语言编写‘三子棋‘

文章目录

  • 系列文章目录
    • [C语言小白急救 表达式求值(两千字教程)](https://editor.csdn.net/md/?articleId=132312494) [C语言小白急救 操作符详解(8千字保姆级教程)](https://editor.csdn.net/md/?articleId=132269381) [C语言小白急救 扫雷游戏(万字保姆级教程)](https://editor.csdn.net/md/?articleId=132259410) [C语言小白急救 使用C语言编写‘三子棋‘](https://mp.csdn.net/mp_blog/creation/editor/132240688)
  • 前言
  • 一、指针介绍
    • 1.指针介绍
    • 2.指针变量
  • 二、 指针和指针类型
    • 1.指针的解引用
    • 2.指针与整数
  • 三、野指针
    • 1. 野指针成因
    • 2.如何规避野指针
  • 四、指针和数组
  • 五、指针的运算
  • 1.指针+- 整数
  • 2.指针-指针
  • 3.指针的关系运算
  • 六、二级指针
  • 七、指针数组
  • 总结


前言


一、指针介绍

1.指针介绍

(1)指针是内存中一个最小内存单元(字节)的一个编号,也就是地址(我们平常所用的二进制位就是其中的一种表现形式)
(2)我们平常口语中所说的指针一般指的是指针变量,是用于存放地址的
总结:指针就是地址,我们平常口语中所说的指针其实是指针变量

2.指针变量

我们可以通过&(取地址操作符)取出变量的内存其实地址,把地址可以存放到一个变量中,这个变量就是指针变量

在32位的机器上,地址是32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储,所以一个指针变量的大小就应该是4个字节。
那如果在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地址。
总结:
指针变量是用来存放地址的,地址是唯一标示一个内存单元的。
指针的大小在32位平台是4个字节,在64位平台是8个字节

二、 指针和指针类型

我们都知道,变量有不同的类型,整形,浮点型等。那指针有没有类型呢?
准确的说:有的。
那么,为什么要有指针类型呢,它有什么作用?

1.指针的解引用

指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。
比如:

    int a = 0x11223344;//将a的地址设置为11223344
	int* m = &a;//设置一个指针变量来存储a的地址
	*m = 0;//解应用m,对m中的地址进行操作,使地址变为0

在这里插入图片描述
当Int* 改为 char* 时

int a = 0x11223344;//将a的地址设置为11223344
	char* m = (char*)&a;//设置一个指针变量来存储a的地址
	//因为a是int型的若想要用char作为指针变量,需要转换
	*m = 0;//解应用m,对m中的地址进行操作,使地址变为0

在这里插入图片描述

所以说,不同的指针类型,对指针解引用的时候的权限也不同

2.指针与整数

指针的类型决定了指针向前或者向后走一步有多大(距离)。
比如:

int main()
{
 int n = 10;
 char *pc = (char*)&n;
 int *pi = &n;
 
 printf("%p\n", &n);
 printf("%p\n", pc);
 printf("%p\n", pc+1);
 printf("%p\n", pi);
 printf("%p\n", pi+1);
 return  0;
}

在这里插入图片描述
从结果(16进制)可以看出,char* 类型的,向后移动了1个字节;int* 类型的向后移动了4个字节。这样的区别在于我们对元素进行比如遍历之类的操作中十分有用
比如:

int arr[] = { 1,2,3,4 };
	int* m = arr;
	char* n = (char*)arr;
	int i = 0;
	for (i=0;i<4;i++)
	{
		printf("%p ",m + i);
	}
	printf("\n");
	for (i = 0; i < 4; i++)
	{
		printf("%p ", n + i);
	}

在这里插入图片描述
除打印首元素地址外,一共执行了3次,char* 类型的,向后移动了3个字节,离到第二个元素的位置还差一个字节;int* 类型的向后移动了8个字节,已经到了第三个元素的位置;如果是对元素进行遍历,那么肯定int* 类型更快。

三、野指针

概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

1. 野指针成因

(1)指针未初始化

int main()
{ 
 int *p;//局部变量指针未初始化,默认为随机值
    *p = 20;
 return 0;
}

这种情况编译器会报错,无法执行
(2) 指针越界访问

int arr[10] = { 0 };
	int* p = arr;
	for (int i=0;i<=10;i++)//循环了11次,但数组中只有十个数
	{
		*p = 1;
		p++;
	}

这种情况下属于越界访问,编译器会报错,无法执行

(3) 指针指向的空间释放

int* tset()
{
	int a = 10;
	return &a;
}

int main()
{
    int* p = tset();
	printf("%d\n",*p);
	return  0;
}

函数 test() 在作用后以及将空间释放,当时你还知道他的地址,这就属于非法访问,也是野指针的一种。比如说:一个陌生人不知道从哪里知道了你的电话号码,整天打电话给你。

2.如何规避野指针

  1. 指针初始化
  2. 小心指针越界
  3. 指针指向空间释放,及时置NULL
  4. 避免返回局部变量的地址
  5. 指针使用之前检查有效性(指针没有明确指向是设为空NULL)

四、指针和数组

大部分情况下数组名表示的是数组首元素的地址
2个例外:
(1)sizeof(数组名),数组名单独放在sizeof内部,此时数组名表示整个数组,计算的是整个数组的大小,单位是字节
(2)&数组名,此时数组名表示整个数组,取出的是整个数组的地址,数组的地址和数组首元素地址,值是一样的,但是类型和意义不一样
例1:数组名表示的是数组首元素的地址

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

在这里插入图片描述
打印出的地址一样,所以数组名是数组首元素的地址。
例2:sizeof(数组名)

int arr[] = { 1,2,3,4,5 };
	printf("%zd\n",sizeof(arr));

在这里插入图片描述
例3:&数组名

int arr[] = { 1,2,3,4,5 };
	printf("%p\n", &arr);
	printf("%p\n", &arr+1);

在这里插入图片描述

五、指针的运算

1.指针± 整数

指针±整数是跳过多少个元素

    int arr[] = { 1,2,3,4,5 };
	int* p = arr;//数组名的是数组首元素的地址
	//arr+i == p+i
	//*(arr+i) == *(p+i) == arr[i]
	//*(arr+i) == arr[i]
	//*(i+arr) == i[arr]
	for (int i=0;i<5;i++)
	{
		printf("%d ",*(p+i));
		//p+i 是数组中下标为i的值
		//p+i 是跳过了i*sizeof(int)个字节
	}

在这里插入图片描述

2.指针-指针

指针相减的前提:指向同一块区域,指针类型相同
指针相减的结果的绝对值是中间的元素个数

    int arr[10] = { 0 };
    //指针相减的前提:指向同一块区域,指针类型相同
	printf("%d",&arr[9]-&arr[0]);
	//指针相减的结果是中间的元素个数

在这里插入图片描述

3.指针的关系运算

size_t My_strelen(char* str)
{
	char* a = str;//设置一个指针来存储首地址
	while (*str != '\0')//这个地址存储的值不等于'\0'
	{
		str++;//指针+1
	}
	return str-a;
}

int main()
{
	char arr[] = "abcdef";
	size_t count=My_strelen(arr);
	printf("%zd ",count);
	return 0;
}

标准规定:
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。

简单点讲就是尽量从前往后比较,不要从后往前

六、二级指针

二级指针就是用来存储一级指针的地址的

int a = 10;
	int* p = &a;//p是指针变量,一级指针变量
	int** pp = &p;//pp是指针变量,二级指针变量
	//二级指针变量前面有两颗* 是指这个二级指针变量指向一个指针变量的
	//二级指针需要解引用两次

七、指针数组

指针数组是数组,里面存放的是指针,根据数组内存放的不同的指针类型,可以分为不同类型的指针数组;如int * char* 等

应用:

    int arr1[] = { 1,2,3,4 };
	int arr2[] = { 4,5,6,7 };
	int arr3[] = { 7,8,9,10 };
	int* arr[] = {arr1,arr2,arr3};

	for (int i = 0; i < 3;i++)//访问arr1 arr2 arr3
	{
		for (int j = 0; j < 4;j++)//访问三数组中的元素
		{
			printf("%d ",arr[i][j]);
		}
		printf("\n");
	}

总结

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker的基本使用

Docker 概念 Docker架构 docker分为客户端&#xff0c;Docker服务端&#xff0c;仓库 客户端 Docker 是一个客户端-服务器&#xff08;C/S&#xff09;架构程序。Docker 客户端只需要向 Docker 服务端发起请求&#xff0c;服务端将完成所有的工作并返回相应结果。 Docker …

设计模式之创建者模式

文章目录 一、介绍二、应用三、案例1. 麦当劳11随心配2. 代码演示3. 演示结果 四、优缺点五、送给读者 一、介绍 建造者模式(Builder Pattern)属于创建型设计模式&#xff0c;很多博客文章的对它的作用解释为用于将复杂对象的创建过程与其细节表示分离。但对于初学者来说&…

机器学习深度学习——NLP实战(情感分析模型——textCNN实现)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——NLP实战&#xff08;情感分析模型——RNN实现&#xff09; &#x1f4da;订阅专栏&#xff1a;机器学习…

Lnton羚通算法算力云平台【PyTorch】教程:torch.nn.Softsign

torch.nn.Softsign 原型 CLASS torch.nn.Softsign() 图 代码 import torch import torch.nn as nnm nn.Softsign() input torch.randn(4) output m(input)print("input: ", input) print("output: ", output)# input: tensor([ 0.0046, -0.4135, -2…

003-Nacos 2.1.x 注册实例源码分析

目录 Nacos 2.1.X注册实例入口接口流程Client 注册 事件处理 服务订阅入口 Nacos 2.1.X 注册实例 入口 com.alibaba.nacos.naming.remote.rpc.handler.InstanceRequestHandler#handleService service Service.newService(request.getNamespace(), request.getGroupName(), r…

7-10 查验身份证

分数 15 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下&#xff1a; 首先对前17位数字加权求和&#xff0c;权重分配为&#xff1a;{7&#xff0c;9&#xff0c;10&#xff0c…

dockerfile编写LNMP

目录 1. 项目环境 2. 服务器环境 二、部署nginx&#xff08;容器IP为192.168.158.26&#xff09; 1、整个Dockerfile文件内容 ​编辑 2、配置nginx.conf文件 3、构建镜像 三、部署mysql 1、整个Docker文件内容 3、生成镜像 4、启动镜像容器 5、验证mysql 四、PHP部署 1…

深入理解Semaphore

Semaphore&#xff08;信号量&#xff09;是操作系统中PV操作的原语在java中的实现&#xff0c;它也是基于AQS实现的。其中PV操作是操作系统中一种实现进程互斥与同步的有效方法。PV操作与信号量&#xff08;S&#xff09;的处理有关&#xff0c;P表示通过&#xff0c;V表示释放…

SpringCloud Gateway服务网关的介绍与使用

目录 1、网关介绍2、SpringCloudGateway工作原理3、三大组件3.1 、Route&#xff08;路由&#xff09;3.2、断言 Predicate3.3、过滤器 filter 4、Gateway整合nacos的使用4.1 、引入依赖4.2、 编写基础类和启动类4.3、 编写基础配置和路由规则4.4 、测试结果 1、网关介绍 客户…

面试之HTTP

1.HTTP与HTTPS的区别 HTTP运行在TCP之上&#xff1b;HTTPS是运行在SSL之上&#xff0c;SSL运行在TCP之上两者使用的端口不同&#xff1a;HTTP使用的是80端口&#xff0c;HTTPS使用的是443端口安全性不同&#xff1a;HTTP没有加密&#xff0c;安全性较差&#xff1b;HTTPS有加密…

为什么选择elasticsearch分布式搜索引擎

文章目录 &#x1f52d;什么是elasticsearch&#x1f320;ELK技术栈&#x1f320;elasticsearch和lucene&#x1f320;为什么不是其他搜索技术&#xff1f; &#x1f52d;总结 &#x1f52d;什么是elasticsearch elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常…

让智慧城市更进一步,无人机解决方案全面应用

在城市规划中&#xff0c;无人机正在颠覆传统的操作和思维方式。这种技术不仅改变了城市管理获取和分析信息的方式&#xff0c;还提供了前所未有的视角&#xff0c;使城市管理能够更加明智地制定策略。 1. 数据采集的新纪元&#xff1a; 城市规划的核心在于数据的收集和分析。…

Mysql5.7.36主从同步实操

主库创建同步账户 #创建备份的账户 CREATE USER backup192.168.32.1 IDENTIFIED BY backup123; #给账户授予备份的权限 GRANT REPLICATION SLAVE ON *.* TO backup192.168.32.1; #刷新权限 FLUSH PRIVILEGES;停止主库 配置主库需要的备份参数 打开my.ini文件&#xff0c;配置…

Hive(一)

一、DDL 1、数据库操作 1&#xff09;、创建数据库 语法&#xff1a; CREATE DATABASE [IF NOT EXISTS] database_name [COMMENT database_comment] [LOCATION hdfs_path] [WITH DBPROPERTIES (property_nameproperty_value, ...)]; 案例&#xff1a; &#xff08;1&…

卷积神经网络——下篇【深度学习】【PyTorch】

文章目录 5、卷积神经网络5.10、⭐批量归一化5.10.1、理论部分5.10.2、代码部分 5.11、⭐残差网络&#xff08;ResNet&#xff09;5.11.1、理论部分5.11.2、代码部分 话题闲谈 5、卷积神经网络 5.10、⭐批量归一化 5.10.1、理论部分 批量归一化可以解决深层网络中梯度消失和…

Anaconda, Python, Jupyter和PyCharm介绍

目录 1 Anaconda, Python, Jupyter和PyCharm介绍 2 macOS通过Anaconda安装Python, Jupyter和PyCharm 3 使用终端创建虚拟环境并安装PyTorch 4 安装PyCharm并导入Anaconda虚拟环境 5 Windows操作系统下Anaconda与PyCharm安装 6 通过 Anaconda Navigator 创建 TensorFlow 虚…

静态代码扫描持续构建(Jenkins)

前提条件 已正确安装、配置Jenkins环境&#xff0c;并装有 Gradle 插件、HTML 插件、SVN 插件等。如下图所示&#xff1a; 已正确安装、配置android sdk&#xff0c;在cmd窗口输入命令“android -h”,回车 配置步骤 打开Jenkins&#xff0c;新建一个job&#xff0c;输入项目…

ABAP 定义复杂的数据结构

最近有个需求是实现ABAP数据类型与JASON类型的转换。想要创建个ABAP的数据类型来接JASON类型是个挺麻烦的事。例如下面这个JASON数据&#xff0c;是个很简单的数据结构。但对ABAP来说有4层了&#xff0c;就有点复杂了。 不过ABAP的数据类型也是支持直接定义数据结构的嵌套的。如…

Nginx特性应用及载装

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上nginx的并发能力在同类型的网页服务器中表现较好&#xff0c;中国大陆使用nginx的网站有&#xff1a;网易、腾讯、阿里等。 …

多维时序 | MATLAB实现WOA-CNN-GRU-Attention多变量时间序列预测

多维时序 | MATLAB实现WOA-CNN-GRU-Attention多变量时间序列预测 目录 多维时序 | MATLAB实现WOA-CNN-GRU-Attention多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现WOA-CNN-GRU-Attention多变量时间序列预测&#xff0c;WOA-CNN-GR…