【C语言】入门——指针

 

目录

 ​编辑

1.指针是什么

 2.指针类型和指针运算

2.1指针+-整数

2.2指针-指针

2.3指针的关系运算

 3.野指针

3.1野指针成因

 👍指针未初始化:

👍指针越界访问:

 👍指针指向空间释放:

3.2如何规避野指针

 4.指针和数组

5.二级指针 

6.指针数组


1.指针是什么

指针,是C语言中的一个重要概念及其特点,也是C语言比较难的部分。

 👍.内存被划分成一个个的内存单元,每个内存单元的大小是1个字节

 👍.每个字节的内存单元都有一个编号,这个编号就是地址,地址在C语言中称为指针

 👍.地址要存储的话,存放在指针变量中

 👍.每个内存单元都有一个唯一的地址来标识

 👍.在32位机器上地址的大小是4个字节,所以指针变量的大小也是4个字节同理:在64位机器上地址的大小是8个字节,所以指针变量的大小也是8个字节

总结:指针就是地址,口语中说的指针通常指的是指针变量。

 2.指针类型和指针运算

 👍变量的创建可以使用不同的类型,而指针也有不同的指针类型

char  *pc = NULL;    //字符指针 
int   *pi = NULL;    //整形指针 
short *ps =NULL;    //短整型指针 
long  *pl = NULL;    //长整型指针 
float *pf = NULL;    //单精度浮点型指针
double *pd = NULL;    //双精度浮点型指针 
……

2.1指针+-整数

 👍指针类型决定了指针进行解引用操作的时候,访问几个字节

int* 访问4个字节

char* 访问1个字节

short* 访问2个字节

 👍指针类型决定了指针+1,-1跳过几个字节:

int* 的指针+1,跳过4个字节;

char* 的指针+1,跳过1个字节;

short* 的指针+1,跳过2个字节;

double* 的指针+1,跳过8个字节

总结:

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

比如:char* 的指针解引用就只能访问1个字节,而int* 的指针解引用能访问4个字节

int main()
{int n = 10;char* pc = (char*)&n;int* pi = &n;//打印n的地址printf("%p\n", &n);printf("%p\n", pc);printf("%p\n", pc + 1);//打印char型跳过一个字节printf("%p\n", pi);printf("%p\n", pi + 1);	//打印整型指针跳过4个字节//0019FB40/*0019FB400019FB410019FB400019FB44*/return  0;
}

2.2指针-指针

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

 👍指针-指针得到的是:两个指针之间的元素个数;

(如果是小地址-大地址就是负的元素个数)

int arr[10] = { 0 };printf("%d\n", &arr[9] - &arr[0]);	//9printf("%d\n", &arr[0] - &arr[9]);	//-9//两个指针相减的前提是:指针指向的同一块连续的空间

2.3指针的关系运算

 👍标准规定:

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

#define N_VALUES 5
float values[N_VALUES];
float *vp;
for (vp = &values[0]; vp < &values[N_VALUES];)
{*vp++ = 0; }

 3.野指针

3.1野指针成因

 👍指针未初始化:


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

👍指针越界访问:


int main()
{int arr[10] = {0};int *p = arr;int i = 0;for(i=0; i<=20; i++){//当指针指向的范围超出数组arr的范围时,p就是野指针*(p++) = i;}return 0;
}

 👍指针指向空间释放:

int* test()
{int num = 15;return &num;    //出了函数,这块内存就不属于我们了,还给了系统
}int main()
{int* p = test();*p = 5;return 0;
}

变量num为局部变量,生命周期从创建开始到出test函数结束,test函数调用结束后num会将空间还给操作系统,此时回到主函数p的地址已经被释放,此时p就是野指针。 

3.2如何规避野指针

 👍 指针初始化

 👍 小心指针越界

 👍 指针指向空间释放即使置NULL

 👍 避免返回局部变量的地址

 👍 指针使用之前检查有效性 

 4.指针和数组

 👍 指针就是指针,指针变量就是一个变量,存放的地址,指针变量的大小是4/8

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

 👍 数组的数组名是数组首元素的地址,地址是可以访问指针变量中

通过指针和数组的关系,可以利用指针的解引用访问数组的元素,不使用数组的下标。

int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int* p = arr;int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);for (i = 0; i < sz; i++){printf("%d ", *(p + i));}return 0;
}
//输出:1 2 3 4 5 6 7 8 9 10

5.二级指针 

指针变量也是变量,是变量就有地址,所以指针变量也可以被指针存储,这个是二级指针。

int main()
{int a = 10;int* pa = &a;        //pa就是指针变量,一级指针变量,表示指针指向的a是intint* *ppa = &pa;    //ppa就二级指针,表示pp指向的p的类型是int*return 0;
}

 同样,也可以通过解引用的方式对其访问。

int b = 20;
*ppa = &b;//等价于 pa = &b;

**ppa 先通过 *ppa 找到 pa ,然后对 pa 进行解引用操作: *pa ,那找到的是 a 

**ppa = 30;
//等价于*pa = 30;
//等价于a = 30;

6.指针数组

 👍指针数组是指针还是数组?
答案:是数组。是存放指针的数组。 

👍可以利用指针数组来用一维数组模拟二维数组

int main()
{//用一维数组模拟一个二维数组int arr1[] = { 1,2,3,4,5 };int arr2[] = { 2,3,4,5,6 };int arr3[] = { 3,4,5,6,7 };int arr4[] = { 4,5,6,7,8 };int* arr[4] = {arr1, arr2, arr3, arr4};    //用指针数组管理一维数组int i = 0;for (i = 0; i < 4; i++){int j = 0;for (j = 0; j < 5; j++){printf("%d ", arr[i][j]);}printf("\n");}return 0;
}

感谢你看到了这里,以上就是我对C语言指针入门的基本概括,文中不足和需要需要改善的地方望得到指点!感激不尽!!! 

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

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

相关文章

SPSS教程:手把手教你绘制簇状条形图

SPSS教程&#xff1a;手把手教你绘制簇状条形图 1、问题与数据 某研究者拟分析受教育程度和性别对幸福指数的影响程度&#xff0c;招募了58位研究对象&#xff0c;包括28位男性和30位女性。每一类性别中&#xff0c;研究对象的受教育程度均分为3类&#xff08;高中及以下、大…

ATC模型转换动态shape问题案例

ATC&#xff08;Ascend Tensor Compiler&#xff09;是异构计算架构CANN体系下的模型转换工具&#xff1a;它可以将开源框架的网络模型&#xff08;如TensorFlow等&#xff09;以及Ascend IR定义的单算子描述文件转换为昇腾AI处理器支持的离线模型&#xff1b;模型转换过程中&a…

异地远程访问内网BUG管理系统【Cpolar内网穿透】

文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名5.1 配置二级子域名6. 使用固定二级子域名远程 前言 BUG管理软件,作为软件测试工程师的必备工具之一。在…

16 Linux之JavaEE定制篇-搭建JavaEE环境

16 Linux之JavaEE定制篇-搭建JavaEE环境 文章目录 16 Linux之JavaEE定制篇-搭建JavaEE环境16.1 概述16.2 安装JDK16.3 安装tomcat16.4 安装idea2020*16.5 安装mysql5.7 学习视频来自于B站【小白入门 通俗易懂】2021韩顺平 一周学会Linux。可能会用到的资料有如下所示&#xff0…

腾讯云免费SSL证书申请流程_2023更新教程

2023腾讯云免费SSL证书申请流程&#xff0c;一个腾讯云账号可以申请50张免费SSL证书&#xff0c;免费SSL证书为DV证书&#xff0c;仅支持单一域名&#xff0c;申请腾讯云免费SSL证书3分钟即可申请成功&#xff0c;免费SSL证书品牌为TrustAsia亚洲诚信&#xff0c;腾讯云百科分享…

linux jar包class热部署 工具 arthas安装及使用

在不改变类、方法 的前提下&#xff0c;在方法中对业务逻辑做处理 或 打日志等情况下使用。 建议线上日志调试时使用&#xff1a; arthas安装 1. 下载文件 arthas-packaging-3.7.1-bin.zip https://arthas.aliyun.com 2. 服务器安装arthas 2.1 服务器指定目录下创建目录 c…

DockerCompose部署es和kibana

DockerCompose文件 version: 3.1 services:elasticsearch:image: elasticsearch:7.13.3container_name: elasticsearchprivileged: trueports:- "9200:9200"- "9300:9300"environment:- ES_JAVA_OPTS-Xms128m -Xmx1024m #设置使用jvm内存大小- cluster.na…

3种等待方式,让你学会Selenium设置自动化等待测试脚本!

一、Selenium脚本为什么要设置等待方式&#xff1f;——即他的应用背景到底是什么 应用Selenium时&#xff0c;浏览器加载过程中无法立即显示对应的页面元素从而无法进行元素操作&#xff0c;需设置一定的等待时间去等待元素的出现。&#xff08;简单来说&#xff0c;就是设置…

swagger---接口文档管理生成管理工具

Swagger–接口生成工具 使用Swagger你只需要按照它的规范去定义接口及接口相关的信息&#xff0c;再通过Swagger衍生出来的一系列项目和工具&#xff0c; 就可以做到生成各种格式的接口文档&#xff0c;以及在线接口调试页面等等。 官网: https://lswagger.io/knife4j是为Jav…

Java基础知识点汇总

一、Java基础知识点整体框架 详细知识点见链接资源&#xff0c;注&#xff1a;框架是用Xmind App完成&#xff0c;查看需下载。 二、基础知识各部分概况 2.1 认识Java 2.2 数据类型和变量 2.3 运算符 2.4 程序逻辑控制 2.5 方法的使用 2.6 数组的定义和使用 2.7 类和对象 2.8 …

生态项目|Typus如何用Sui特性制作动态NFT为DeFi赋能

对于许多人来说&#xff0c;可能因其涉及的期权、认购和价差在内的DeFi而显得晦涩难懂&#xff0c;但Typus Finance找到了一种通过动态NFT使体验更加丰富的方式。Typus NFT系列的Tails为用户带来一个外观逐渐演变并在平台上提升活动水平时获得新特权的角色。 Typus表示&#x…

智慧工厂的未来:视频+数字孪生与工业4.0的融合

视频数字孪生技术在智慧工厂项目中具有广泛的应用&#xff0c;为生产制造提供了前所未有的机会和优势。下面将探讨数字孪生技术在智慧工厂项目中的多个应用场景。 数字孪生技术的首要应用之一是生产流程优化。通过将现实世界的工厂映射到数字孪生模型中&#xff0c;制造…