C语言第十三课--------初阶指针的认识--------重要部分

作者前言

🎂        ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂

   🎂      作者介绍:                              🎂🎂

       🎂 🎉🎉🎉🎉🎉🎉🎉              🎂

          🎂作者id:老秦包你会,         🎂

简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂

             喜欢学习C语言和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨         🎂🎂🎂🎂🎂🎂🎂🎂

                 🎂个人主页::小小页面🎂

                  🎂gitee页面:秦大大🎂

                   🎂🎂🎂🎂🎂🎂🎂🎂
        🎂  一个爱分享的小博主 欢迎小可爱们前来借鉴🎂

_______________________________________________________

______________________________________________________________________

目录

1. 指针是什么
2. 指针和指针类型
3. 野指针
4. 指针运算
5. 指针和数组
6. 二级指针
7. 指针数组
________________________________________________________

插播小知识

1.全局变量,没有给初始值时,编译其会默认将其初始化为0。局部变量必须初始化。如int a;

2.'\0'是/ddd ,就是0

3.数组名是一个常量,不能++,相当于5++是错的,如果存放到一个变量里面,变量就可以++,

指针是什么

1. 指针是内存中一个最小单元的编号,也就是地址
2. 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量
总结:指针就是地址,口语中说的指针通常指的是指针变量

#include <stdio.h>
int main()
{
	int a = 10;//是向内存中栈区空间申请4个字节的空间,这4个字节用来存放10这个数值
	int* p = &a;//这里我们对变量a,取出它的地址,可以使用&操作符。a变量占用4个字节的空间,这里是将
	//a的4个字节的空间,这里将a的4个字节的空间,这里是将a的4个字节的第一个字节的地址存放在p变量中,p就是一个指针变量
	return 0;
}

存储地址连续的话只取第一个字节地址进行存储

指针变量,用来存放地址的变量。(存放在指针中的值都被当成地址处理)。
一个小的内存单元是1个字节
                              

对于 32 位的机器,假设有 32 根地址线,那么假设每根地址线在寻址的时候产生高电平(高电压)和低电平(低电压)就是(1 或者 0 );上图是32根地址线,可以产生2^32次方个编码,
内存的大小是可以设置的
如果每个编码指向一个字节的内存,2^32次方个字节,那么就会有4G的内存
32 位的机器上,地址是 32 0 或者 1 组成二进制序列,那地址就得用 4 个字节的空间来存储,所以
一个指针变量的大小就应该是 4 个字节。
那如果在 64 位机器上,如果有 64 个地址线,那一个指针变量的大小是 8 个字节,才能存放一个地
地址的大小是由地址线决定的,一根地址线一个bit位
总结:
1.内存被划分成一个个的内存单元,每个内存单元是一个字节
2.每个字节的内存单元都有一个编号,这个编号就是地址,地址在C语言中被称为指针
3.地址要存储的话,存放在指针变量中
4.每个内存单元都有一个唯一的地址来标识
5.在32位机器上地址的大小是4个字节,所以指针变量的大小也是4个字节,同理在64位机器上地址的大小是8个字节,所以指针变量的大小也是8个字节

指针和指针类型

 从上图可以看出&a的地址和a里面存储的样式,当我们使用*p进行修改值的时候就会有

 可以发现四个字节全部修改了,

如果我们换成 char* p来接受&a,再利用*p修改

就会发现只修改了一个字节,所以指针类型大小一样,但是解引用的进行操作时就会不一样,

1.即指针类型决定了解引用操作是操作几个字节 ,char* 操作一个字节,short* 操作两个字节

char* p还是int *p 存储同一个地址,里面的内容是不变的

如果地址加1 就会有不一样的效果,

2.指针类型的决定了地址加1 是跳过几个字节.比如 char* p   p+1跳过一个字节, int* 的指针加1跳过4个字节

野指针

野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
#include <stdio.h>
int a;
int main()
{
	int* p = 0x11223344;
	*p;
	printf("%d", a);
	return 0;
}

存放的内容不是程序内的,

野指针成因
1.指针未初始化
在vs编译器如果指针变量未初始化,就会报错
#include <stdio.h>
int main()
{
	int* p;
	*p = 10;
	return 0;
}

 2. 指针越界访问

#include <stdio.h>
int main()
{
	int arr[10] = { 0 };
	int* p = arr;
	int i = 0;
	for (i = 0; i <= 10; i++)
	{
		*p = 1;
		p++;
	}
	return 0;
}

如果越界访问就会报错 ,当指针越界(超出数组arr的范围),p就是指针

3. 指针指向的空间释放
#include <stdio.h>
int* test()
{
	int a = 0;
	return &a;
}
int main()
{
	int* p = test();
	//p指向了被释放的地址,p就是野指针
	printf("%d", *p);
	return 0;
}

p指向了被释放的地址,p就是野指针

规避野指针
1. 指针初始化
如果不知道初始化什么值就初始化NULL
int* p = NULL

NULL是0

2. 小心指针越界
3. 指针指向空间释放即使置 NULL
4. 避免返回局部变量的地址
5. 指针使用之前检查有效性

指针运算

#include <stdio.h>
int main()
{
	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int* p = arr;
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", *(p + i));//p指向的是数组首元素的地址
		// p+i 是数组中下标为i的元素的地址
	}
	return 0;
}

以上图为例

arr == p   可以推出 arr+i == p+i   也能推出 *(arr+i) == *(p+i) ==arr[i] ,更能写成*(i+arr) == i[arr],

指针+- 整数
#define SZ 5
#include <stdio.h>
int main()
{
	int arr[SZ];
	int* p = arr;
	for (p = arr; p < &arr[SZ];)
	{
		*p++ = 0;
	}
	return 0;
}

p < &arr[SZ]的原理为:

 指针的关系运算

#define SZ 5
#include <stdio.h>
int main()
{
	int arr[10];
	int* p = NULL;
	for (p = &arr[SZ]; p > &arr[0];)
	{
		*--p = 0;
	}
	return 0;
}
标准规定:
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与
指向第一个元素之前的那个内存位置的指针进行比较。
简单的理解是数组元素地址只能和数组之后的的地址比较, 不能和之前的比较
指针-指针
#define SZ 5
#include <stdio.h>
int main()
{
	int arr[SZ];
	printf("%d", &arr[9] - &arr[0]);
	return 0;
}

指针-指针的前提:两个指针指向同一块区域,指针类型要相同

指针-指针差值的绝对值是指针和指针之间的元素个数

指针和数组

指针就是指针(指针变量),指针大小为4/8

数组就是数组,存放一组数据的,数组的大小取决于数组元素的个数和类型,

数组名是首元素的地址,但有两个例外:

1.sizeof 的数组名表示整个数组,计算的是整个数组的大小

2.&数组名,表示的是整个数组,取出的是数组的地址,数组的地址和数组首元素的地址,值是一样的,但是类型和意义不一样

二级指针

#include<stdio.h>
int main()
{
	int a = 9;
	int* p = &a;//p是指针变量,一级指针
	int** pp = &p;//pp是指针变量, 二级指针
	int*** ppp = &pp;//ppp是指针变量, 三级指针
	*ppp; //pp
	**ppp;//p
	***ppp;//a
	***ppp = 10;
	printf("%d", a);

	return 0;
}

二级指针简单理解就是用于存放一级指针地址的指针变量

指针数组

字符数组:存放字符的数组

整形数组:存放整形的数组

那么指针数组就是存放指针的数组

char * arr[] 存放字符指针的数组

short * arr[] 存放短整型指针的数组

int* arr[] 存放整形指针的数组

#include<stdio.h>
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7 };
	int arr2[] = { 2,3,4,5,6,7,8 };
	int arr3[] = { 3,4,5,6,7,8,9 };
	int* arr[] = { arr1, arr2, arr3 };
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 5; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}


	return 0;
}

总结:

初阶指针就介绍到这里了有不懂的小可爱可以私聊我

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

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

相关文章

Hadoop 之 Hive 4.0.0-alpha-2 搭建(八)

Hadoop 之 Hive 搭建与使用 一.Hive 简介二.Hive 搭建1.下载2.安装1.解压并配置 HIVE2.修改 hive-site.xml3.修改 hadoop 的 core-site.xml4.启动 三.Hive 测试1.基础测试2.建库建表3.Java 连接测试1.Pom依赖2.Yarm 配置文件3.启动类4.配置类5.测试类 一.Hive 简介 Hive 是基于…

Nginx的搭建与核心配置

一、Nginx 1、Nginx概述 一款高新能、轻量级Web服务软件系统资源消耗低对HTTP并发连接的处理能力高单台物理服务器可支持30 000&#xff5e;50 000个并发请求。 2、Nginx主要功能&#xff1a; 静态文件服务&#xff1a;nginx可直接提供静态文件服务&#xff0c;HTML、CSS、J…

STM32CubeMX+VSCODE+EIDE+RT-THREAD 工程创建

Eide环境搭建暂且不表&#xff0c;后续补充。主要记录下Vscode环境下 创建Rt-thread工程的过程。分别介绍STM32CubeMX添加rtt支持包的方式和手动添加rtt kernel方式。STM32CubeMX生成工程的时候有"坑"&#xff0c;防止下次忘记&#xff0c;方便渡一下有缘人&#xff…

maven发布到中央仓库

创建账号 https://issues.sonatype.org 【第二步】登录申请新项目 右上角点击Create&#xff0c;Project选择第一项&#xff0c;有的时候带不出来第二个New Project&#xff0c;可以再选一次Project的选项。

centos7 ‘xxx‘ is not in the sudoers file...

如题 执行命令输入密码后时报错&#xff1a; [sudo] password for admin &#xff08;我的账户&#xff09;原因&#xff0c;当前用户还没有加入到root的配置文件中。 解决 vim打开配置文件&#xff0c;如下&#xff1a; #切换到root用户 su #编辑配置文件 vim /etc/sudoe…

2023软件测试面试热点300问(接口自动化测试篇)

分享100道涉及到的接口自动化测试面试题&#xff0c;供大家参考&#xff1a; 我已经把这些面试题全部整理在一个文档里面了&#xff0c;同时还有这些面试题的视频教程分享&#xff0c;全部放在文末了&#xff0c;需要的可以直接去观看&#xff0c;或者直接点击文末小卡片免费领…

路由器DHCP实验

拓扑图 配置 # 配置ip地址并开启dhcp [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip addr 192.168.1.1 255.255.255.0 [Huawei-GigabitEthernet0/0/0]dhcp enable## 配置dns地址 [Huawei-GigabitEthernet0/0/0]dhcp dns-list 192.168.1.5## 指定某个接口开通DHCP 功能…

Zebec Payroll :计划推出 WageLink On-Demand Pay,进军薪酬发放领域

“Zebec Protocol 生态旨以 Web3 的方式建立全新的公平秩序&#xff0c;基于其流支付体系构建的薪酬支付板块&#xff0c;就是解决问题的一把利刃” Zebec Protocol 在创立之初就有着一个十分宏大的愿景&#xff0c;其希望通过 Web3 的方式来进一步打破世界上一些不公平现象。 …

【小沐学NLP】在线AI绘画网站(百度:文心一格)

文章目录 1、简介2、文心一格2.1 功能简介2.2 操作步骤2.3 使用费用2.4 若干示例2.4.1 女孩2.4.2 昙花2.4.3 山水画2.4.4 夜晚2.4.5 古诗2.4.6 二次元2.4.7 帅哥 结语 1、简介 当下&#xff0c;越来越多AI领域前沿技术争相落地&#xff0c;逐步释放出极大的产业价值&#xff0…

OpenCV之信用卡识别实战

文章目录 代码视频讲解模板匹配文件主程序(ocr_template_match.py)myutils.py 代码 链接: https://pan.baidu.com/s/1KjdiqkyYGfHk97wwgF-j3g?pwdhhkf 提取码: hhkf 视频讲解 模板匹配文件 主程序(ocr_template_match.py) # 导入工具包 from imutils import contours # 从…

【LeetCode】236.二叉树的最近公共祖先

题目 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以是它…

刷了3个月的华为OD算法题,总结了270多道,谈谈自己的感悟

目录 一、考研二战&#xff0c;入职华为&#xff0c;反向调剂电子科大深圳二、题目描述三、输入描述四、输出描述五、解题思路六、Java算法源码七、效果展示1、输入2、输出3、说明 大家好&#xff0c;我是哪吒。 最近一直在刷华为OD机试的算法题&#xff0c;坚持一天三道题的节…

STL空间配置器入门

STL简介   STL&#xff08;Standard Template Library&#xff0c;标准模板库&#xff09;&#xff0c;从根本上说&#xff0c;STL是一些“容器”的集合&#xff0c;这些“容器”有list,vector,set,map等&#xff0c;STL也是算法和其他一些组件的集合。 谈及组件&#xff0c…

如何在免费版 pycharm 中使用 github copilot (chatGPT)?

起因 在 vscode 中使用了 github copilot 以后&#xff0c;感觉这个人工智能还不错。 但 vscode 对于 python 项目调试并不是特别方便&#xff0c;所以想在 Pycharm 中也能使用同一个 github 账号&#xff0c;用上 copilot 的功能。 不需要等待&#xff0c;安装即用&#xff…

C++和Lua交互总结

C和Lua交互总结 Chapter1. C和Lua交互总结一、Lua与C的交互机制——Lua堆栈二、堆栈的操作三、C 调用 Lua1&#xff09;C获取Lua值2&#xff09;C调用Lua函数示例&#xff1a; 四、Lua 调用 C包装C函数 最后总结一下 Chapter1. C和Lua交互总结 原文链接&#xff1a;https://bl…

数据结构: 线性表(带头双向循环链表实现)

之前一章学习了单链表的相关操作, 但是单链表的限制却很多, 比如不能倒序扫描链表, 解决方法是在数据结构上附加一个域, 使它包含指向前一个单元的指针即可. 那么怎么定义数据结构呢? 首先我们先了解以下链表的分类 1. 链表的分类 链表的结构非常多样, 以下情况组合起来就有…

【图论】无向图连通性(tarjan算法)

割边&#xff1a;dfn[u]<low[v] 割点&#xff1a;dfn[u]<low[v] (若为根节点&#xff0c;要有两个v这样的点) 一.知识点&#xff1a; 1.连通&#xff1a; 在图论中&#xff0c;连通性是指一个无向图中的任意两个顶点之间存在路径。如果对于图中的任意两个顶点 u 和 v&…

06 HTTP(下)

06 HTTP&#xff08;下&#xff09; 介绍服务器如何响应请求报文&#xff0c;并将该报文发送给浏览器端。介绍一些基础API&#xff0c;然后结合流程图和代码对服务器响应请求报文进行详解。 基础API部分&#xff0c;介绍stat、mmap、iovec、writev。 流程图部分&#xff0c;描…

写材料使用恰当的词汇和专业术语,不要使用生僻或不恰当的词汇

注意使用恰当的词汇和专业术语是公文写作中的关键&#xff0c;不要使用过于生僻或不恰当的词汇。 首先&#xff0c;在选择词汇和专业术语时&#xff0c;需要了解公文所涉及的领域和专业知识。对于不同领域和专业的公文&#xff0c;需要选择恰当的词汇和术语&#xff0c;以确保公…

Akuity Certified ArgoCD课程学习与认证

今天是「DevOps云学堂」与你共同进步的第 48天 第⑦期DevOps实战训练营 7月15日已开营 实践环境升级基于K8s和ArgoCD 本文主要分享&#xff0c;如何免费地参与由Akuity Academy提供的ArgoCD GitOps 培训课程并取得认证证书。 目前Akuity Academy只发布了Introduction to Contin…