【C语言】3天速刷C语言(指针初识)
指针是啥
在计算机中,指针式编程语言中的与的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。
【指针】
指针是个变量,存放内存单元的地址(编号)。
对应使用代码:
#include <stdio.h>
int main()
{int a = 10;//在内存中开辟一块空间int *p = &a;//这里我们对变量a,取出它的地址,可以使用&操作符。//将a的地址存放在p变量中,p就是一个之指针变量。return 0;
}
【总结】
指针就是变量,用来存放地址的变量。(存放在指针中的值都被当成地址处理)。
指针是用来存放地址的,地址是唯一标示一块地址空间的。
指针的大小在32位平台是4字节,在64位平台是8字节。
指针和指针类型
明确一点:指针是有不同类型的。
char *pc = NULL;
int *pi = NULL;
short *ps = NULL;
long *pl = NULL;
float *pf = NULL;
double *pd = NULL;
这里可以看到,指针的定义方式是: type + * 。 其实: char* 类型的指针是为了存放 char 类型变量的地址。 short* 类型的指针是为了存放 short 类型变量的地址。 int* 类型的指针是为了存放int 类型变量的地址。
指针类型的意义呢?
指针+-整数
#include <stdio.h>
//演示实例
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;
}
【总结】
指针的类型决定了指针向前或者向后走一步有多大!
指针的解引用
//演示实例
#include <stdio.h>
int main()
{int n = 0x11223344;char *pc = (char *)&n;int *pi = &n;*pc = 0; //重点在调试的过程中观察内存的变化。*pi = 0; //重点在调试的过程中观察内存的变化。return 0;
}
【总结】
指针的类型决定了,对指针解引用时有多大的权限(操作几个字符)。比如:char*的指针解引用只能访问一个字节,而int*的指针解引用就能够访问四个字节。
野指针
概念:野指针就是指针指向的位置时不可知的(随机的、不正确的、没有明确限制的)
野指针成因:
指针没有初始化
#include <stdio.h>
int main()
{int *p;//局部变量指针未初始化,默认为随机值*p = 20;return 0;
}
指针越界访问
#include <stdio.h>
int main()
{int arr[10] = {0};int *p = arr;int i = 0;for(i=0; i<=11; i++){//当指针指向的范围超出数组arr的范围时,p就是野指针*(p++) = i;}return 0;
}
指针指向的空间释放(暂不介绍)
如何避免野指针
指针初始化
小心越界
指针指向空间释放即使置NULL(c++为nullptr)
指针使用之前检查有效性
#include <stdio.h>
int main()
{int *p = NULL;//....int a = 10;p = &a;if(p != NULL){*p = 20;}return 0;
}
指针运算
指针+-整数
指针-指针
指针的关系运算
指针+-整数
#define N_VALUES 5
float values[N_VALUES];
float *vp;
//指针+-整数;指针的关系运算
for (vp = &values[0]; vp < &values[N_VALUES];)
{*vp++ = 0;
}
指针-指针
int my_strlen(char *s)
{char *p = s;while(*p != '\0')p++;return p-s;
}
指针的关系运算
for(vp = &values[N_VALUES-1]; vp >= &values[0];vp--)
{*vp = 0;
}
实际绝大部分的编译器上是可以顺利完成任务的,然而我们还是应该避免这样写,因为标准并不保证它可行。
【标准规定】
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。
指针和数组
数组名是什么:
#include <stdio.h>
int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9,0};printf("%p\n", arr);printf("%p\n", &arr[0]);return 0;
}
可见数组名和数组首元素的地址是一样的
【结论】
数组名表示的是数组首元素地址
二级指针
指针变量存放的地址,就是二级指针。
int b = 20;
*ppa = &b;//等价于 pa = &b;
**ppa = 30;
//等价于*pa = 30;
//等价于a = 30;
【C语言】3天速刷C语言(指针初识)相关推荐
- 【C语言】深入理解数组和指针——初识指针
哈喽大家好,我是保护小周ღ,C语言,接下来给大家带来的是深入理解数组和指针的初识指针,这篇主要讲的是基础指针的相关知识,是博主的所见所闻,细节上的知识后面会这里面没有提,会放在后期的文章中与数组相结合 ...
- 【C语言】3天速刷C语言(初识)
[声明] 本篇博客只用于对与刚学习C语言的同学的一个初始了解,具体内容请继续关注本专栏后续内容. 什么是C语言 C语言是一门通用计算机编程语言,广泛应用于底层开发.C语言的设计目标是提供一种能以简易的 ...
- 【C语言】3天速刷C语言(语句、函数)
语句 分支语句 if语句 if语句语法结构 语法结构: if(表达式)语句; if(表达式)语句1; else语句2; //多分支 if(表达式1)语句1; else if(表达式2)语句2; els ...
- C语言计算机二级/C语言期末考试 刷题(二)
收集了一些经典C语言计算机二级和C语言期末考试题库 整理不易,大家点赞收藏支持一下 祝大家计算机二级和期末考试都高分过 系列文章: C语言计算机二级/C语言期末考试 刷题(一) 目录 一.填空 共 ...
- C语言计算机二级/C语言期末考试 刷题(四)
收集了一些经典C语言计算机二级和C语言期末考试题库 整理不易,大家点赞收藏支持一下 祝大家计算机二级和期末考试都高分过 系列文章: C语言计算机二级/C语言期末考试 刷题(一) C语言计算机二级/C语 ...
- c语言输入后没答案,C语言章节习题及答案(无指针)解读.doc
C语言章节习题及答案(无指针)解读 <C程序设计>复习题集 第2章 基础概念 一.选择题(在下列各题的A).B).C).D)四个选项中,只有一个选项是正确的) 2.1以下叙述中正确的是 A ...
- c语言游戏call调用,C语言-植物大战僵尸-刷僵尸call;fps游戏CS-方框透视(矩阵+传统)...
C语言-植物大战僵尸-刷僵尸call:fps游戏CS-方框透视(矩阵+传统)前言:大家好,我是向上先生,嘿嘿~最近在学习逆向.反汇编等等,首先我在非常感谢52pojie这个平台,差不多很多学习资源都是 ...
- C语言复习篇之数组与指针
C语言复习篇之数组与指针 学习了一段时间的嵌入式linux了,学习中有很多的东西需要总结,有经验有教训,我觉得把他写下来会更好,就当做是一种笔记的形式,记录学习中的点点滴滴,不仅仅自己可以经常复习,也 ...
- 【示例】C语言中利用数组存放函数指针
C语言中利用数组存放函数指针,增加函数使用的灵活性.使用时只需提供数组索引,即可调用不同函数. 预备知识: 1.指向函数的指针 一个函数在编译时被分配一个入口地址,这个地址就被称为函数的指针. 例如: ...
最新文章
- lab_2 Selenium
- 【LeetCode】198.打家劫舍
- K8S——单master节点和基于单master节点的双master节点二进制部署(本机实验,防止卡顿,所以多master就不做3台了)
- date js 半年_JavaScript Date对象
- altera fpga sdi输出方案_高段位攻城狮是这样解决SI分析、DDR、FPGA国产化问题的! | 电巢直播答疑汇总...
- Google Instant Apps VS 微信小程序
- 64K方法数限制原理与解决方案总结
- com.android.phone已停止无限重启,Android Q没法用,大批用户反馈手机无限重启
- DTAS尺寸公差分析软件-三维尺寸公差分析软件尺寸链计算软件
- 用Python分割文件夹
- 人工蜂群算法python_人工蜂群算法简介与程序分析
- python基础知识
- 如何搭建一个react项目?
- 高清晰度彩色电影胶卷
- android视频播放器全屏,jiaozivideoplayer
- 中职高考计算机专业真题,中职高考计算机试题及答案
- 嵌入式linux下3G上网卡移植
- Allegro软件元器件对齐功能
- nc 文件的nan识别
- Unity 富文本的使用