C语言指针教程示例详解

目录
  • 指针
  • 内存
  • 指针类型
  • 指针运算
  • 二级指针
  • 指针数组

指针

指针提供了对地址操作的一种方法,因此,使用指针可使得 C 语言能够更高效地实现对计算机底层硬件的操作。另外,通过指针可以更便捷地操作数组。在一定意义上可以说,指针是 C 语言的精髓。

概念解释就不去搬原定义了,又臭又长不好理解,精炼两点就是:

1.指针是内存中的一个最小单元的编号,也就是地址;

2.平时我们说的指针,通常是指指针变量,用来存储内存地址的变量

也就是说:指针就是地址,口语中指针通常是指针变量

内存

要搞明白指针首先要搞明白内存。

我们把一大坨内存划分为一个个小的内存单元,一个基本单元大小为一个字节,我们对应需要某个单元里面的数据时,就要进行查找,大海捞针的工程如果逐个排查就显得低效而呆滞,于是我们就对其编号,如同对一个大酒店的房间设置门牌号一样。我们说的内存编号就相当于内存地址

这个编号是怎么产生的呢?我们的机子有32位和64位,对应有32根地址线和64根地址线,地址线其实就是电线,通电后高低电频转化为数字信号对标的就是 1 和 0 。强调一点,这些编号是不需要存起来的。

我们实际看一下数据在内存中的布局,通过调试的内存窗口可以进行监视,

为了直观看到我直接在地址栏输入 &a 查看当前内容:

发现确实如此。

指针类型

int* pa = &a;
char* pb = &a;

意义:
我们把 int* 放到char里面可行吗?理论上是可以的,因为指针大小都是四个字节,但是放到char里面解引用只访问了一个,总结一下,指针类型赋予了指针的访问权限大小。

野指针

形如:

int main()
{
int *p;
*p = 20;

return 0;
}

野指针就像是野狗,这条野狗它没有主人,因此它很危险见谁咬谁;同理,指针没有初始化时,它没有指向任何对象,就不敢动他,p的地址是随机值,分配的空间也是不知道的。
野指针成因除了未初始化还有就是越界访问或者指针指向空间已经释放。所以一定要初始化,有值就指向这个值,没有就直接NULL或者分配一块合理的空间以保证有效性(如下)。当你有一个指针创建了不想用时,记得一定把这条野狗栓在树上!

int* p = NULL;
int* q = (int*)malloc(1024);

指针运算

指针之间其实是可以进行计算的,比如指针 - 指针,如下:

int main()
{
int a[5]={0};
prinf("%d\n",&a[4]-&a[0]);
prinft("%d\n",&a[0]-&a[4]);
return 0;
}

结果是4,-4。所以不难知道两个地址相减就是元素的个数,这个表达式的前提是两个指针指向同一块空间。
有一些特殊情况需要给大家声明一下:

for (int *p = &arr[NUM - 1]; p >= arr; p--)
 {
        printf("%d ",*p);
 }

当数组–这种结构存在时,虽然很多编译器可以顺利完成,但还是应该避免这样写,因为标准并不保证它可行,规定是:

C语言标准规定了允许指向数组元素的指针可以和最后一个元素后面的内存位置进行指针比较,不允许与第一个元素之前的内存位置进行比较

二级指针

看上去是不是感觉很高大上?不要想的太神秘也不用过分联想。
我们在写指针时“ * ”不管是靠近类型还是变量意义都是一样的,于是就有下面操作:

int main()
{
int a = 10;
int* p = &a;
int** pp = &p;
return 0;
}

这里 a取地址存入p,假设 p 是 0x0022FF40,在32位平台下 p 有没有地址呢?当然有,指针大小为 4 个字节嘛,必定会在内存中开辟一块地方,那么我取 p 的地址时就是所谓的二级指针。
欧吼吼~~,对,快乐就是无限套娃,同理得三级,四级……

指针数组

我们有整型数组形如:int arr[10] ;存放整型的数组

同理如:int* arr[10] = { &a,&b,&c…… } ,就是用来存放整型指针的数组。

以上就是C语言指针教程示例详解的详细内容,更多关于C语言指针教程的资料请关注我们其它相关文章!

(0)

相关推荐

  • C语言修炼之路初识指针阴阳窍 地址还归大道真下篇

    目录 (壹) 行经旅途遇猛虎--“野指针” 1.1野指针成因 1.指针未初始化 2.指针越界访问 3. 指针指向的空间释放 1.2 巧法规避野指针 (贰) 指针之运算 2.1 指针+-整数 2.2 指针-指针 课堂小补充 (利用指针-指针实现strlen) (叁) 指针和数组 3.1 数组名 3.2 二级指针 3.3 指针数组 (壹)  行经旅途遇猛虎 -- “野指针” 概念:野指针就是指针指向的位置是不可知的(随机的.不正确的.没有明确限制的)指针变量在定义时如果未初始化,其值是随机的,指针变

  • 深入浅出理解C语言指针的综合应用

    目录 指针是什么? 指针变量 使用指针变量的例子 通过指针引用数组 &数组名vs数组名 野指针 野指针成因 1.指针未初始化 2.指针越界访问 如何避免野指针 指针运算 指针是什么? 指针是c语言中的一个重要概念,也是C语言的一个重要的特色,正确而灵活地运用它,可以使程序简洁,紧凑,高效,每一个学习和使用c语言的人,都应当深入了解地学习和掌握指针,可以说,不掌握指针就是没有掌握C的精华也可以说 指针是C语言的灵魂(doge) 由于通过地址能找到所需的变量单元,可以说,地址指向变量单元,打个比方,

  • 老生常谈C语言中指针的使用

    目录 前提 一.指针基础 1.1变量指针 1.2数据指针 1.3指针的本质 1.4指针数组 1.5指针的移动 1.5Scanf函数的解释 二.指针的进阶玩法 2.1二维指针 2.2结构体指针 结语 前提 指针,是C语言中的一个重要概念及其特点,也是掌握C语言比较困难的部分.指针也就是内存地址,指针变量是用来存放内存地址的变量,在同一CPU构架下,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同.有了指针以后,不仅可以对数据本身,也可以对

  • C语言修炼之路初识指针阴阳窍 地址还归大道真上篇

    目录 (壹) 敢问指针为何物 1.1 指针的概念 1.2 指针的背后 (贰) 指针和指针类 2.1 指针的类型 2.2 指针类型的意义 2.3 指针的解引用 (壹)  敢问指针为何物 1.1  指针的概念 在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值.由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元.因此,将地址形象化的称为“指针”.意思是通过它能找到以它为地址的内存单元. 那我们就可以这样

  • C语言双指针多方法旋转数组解题LeetCode

    目录 暴力思路 外加数组 格局抬高 环形替代 LeetCode题目如下: 首先这个中等难度我是没搞懂,后面才发现原来中等中在要求多方法上,那就来看看怎么搞定他吧. 暴力思路 首先我说一下我本人的思路,就是函数进行倒序操作,分三步: 1.整体倒序 :1234567-------7654321 2.前半部分倒序:7654321------- 5674321 3.后半部分倒序:5674321-------5671234 由于题目已经给出了我们 k 的值,我们直接暴力思路(注意是暴力思路非暴力求解),双

  • 赌你会懵的C语言指针进阶数组场景解析

    目录 正片开始 一维数组 字符数组 二维数组 整点硬菜 正片开始 细化指针这一部分内容,现在着重把一些指针的运用情景搬出来康康,如果对指针盘的不是非常熟练,或者指针还出于入门阶段的铁子请绕道(晕头警告) 直接给大家盘个套餐: 一维数组 int a[] = {1,2,3,4,5}; printf("%d\n",sizeof(a)); printf("%d\n",sizeof(a+0)); printf("%d\n",sizeof(*a)); pri

  • C语言中const和指针的秘密你知道吗

    目录 指针的赋值 问题 ANSI C 有关简单赋值的标准 问题解决 char* 和 const char* char** 和 const char** const修饰 const修饰变量 const修饰指针 const int* p int* const p const int* const p 总结 指针的赋值 问题 将一个类型为 char** 的值赋值给一个 const char** 类型的对象是否合法呢? 先说结果,在vs的环境下,编译器不会报错也不会有任何警告. 但在linux环境下用g

  • 深入了解C语言中的const和指针

    目录 前言 指针的赋值 问题 ANSI C 有关简单赋值的标准 问题解决 const修饰 const修饰变量 const修饰指针 前言 文章内容由阅读<C专家编程>整理而来.希望可以帮助大家解决在指针赋值和const方面的问题,也希望大家多多指正文章中的错误,共同进步. 指针的赋值 问题 将一个类型为 char** 的值赋值给一个 const char** 类型的对象是否合法呢? 先说结果,在vs的环境下,编译器不会报错也不会有任何警告. 但在linux环境下用gcc编译就会出现下面的警告:

  • C语言双指针算法朋友过情人节我过算法

    目录 双指针 对撞指针 快慢指针 真题实战 双指针 首先咱得知道何为双指针,听起来很上流,其实有手就行. 双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的. 换言之,双指针法充分使用了数组有序这一特征,当遇到有序数组时,应该优先想到双指针来解决问题,因两个指针的同时遍历会减少空间复杂度和时间复杂度从而在某些情况下能够简化运算 对撞指针 类似于相遇问题,对撞指针是指在有序数组中,将指向最左侧

  • C语言指针教程示例详解

    目录 指针 内存 指针类型 指针运算 二级指针 指针数组 指针 指针提供了对地址操作的一种方法,因此,使用指针可使得 C 语言能够更高效地实现对计算机底层硬件的操作.另外,通过指针可以更便捷地操作数组.在一定意义上可以说,指针是 C 语言的精髓. 概念解释就不去搬原定义了,又臭又长不好理解,精炼两点就是: 1.指针是内存中的一个最小单元的编号,也就是地址: 2.平时我们说的指针,通常是指指针变量,用来存储内存地址的变量 也就是说:指针就是地址,口语中指针通常是指针变量 内存 要搞明白指针首先要搞

  • C语言数据结构顺序表中的增删改(头插头删)教程示例详解

    目录 头插操作 头删操作 小结 头插操作 继上一章内容(C语言数据结构顺序表中的增删改教程示例详解),继续讲讲顺序表的基础操作. 和尾插不一样,尾插出手阔绰直接的开空间,咱头插能开吗?好像没听说过哪个接口可以在数据前面开一片空间吧,那我们思路就只有一个了——挪数据.那应该从第一位开始挪吗?注意,这和 memcpy 函数机制是一样的,并不意味着后面数据一起挪动,也不会彼此独立,而是相互影响,挪动的数据会对后面数据进行覆盖. 那我们的逻辑就应该是从后往前挪,那我们就直接定一个下标,指向这段空间的最后

  • go语言结构体指针操作示例详解

    目录 指针 go指针操作 不能操作不合法指向 new函数 指针做函数的参数 数组指针 结构体指针变量 结构体成员普通变量 结构体成员指针变量 结构体比较和赋值 结构体作为函数参数 指针 指针是代表某个内存地址的值.内存地址储存另一个变量的值. 指针(地址),一旦定义了不可改变,指针指向的值可以改变 go指针操作 1.默认值nil,没有NULL常量 2.操作符“&”取变量地址,“*“通过指针(地址)访问目标对象(指向值) 3.不支持指针运算,不支持“->”(箭头)运算符,直接用“.”访问目标成

  • node.js中Util模块作用教程示例详解

    目录 从类型判断说起 严格相等 Error First & Promise 调试与输出 从类型判断说起 在 JavaScript 中,进行变量的类型校验是一个非常令人头疼的事,如果只是简单的使用 typeof 会到各种各样的问题. 举几个简单的: console.log(typeof null) // 'object' console.log(typeof new Array) // 'object' console.log(typeof new String) // 'object' 后来,大

  • TS 类型兼容教程示例详解

    目录 类型兼容 简单类型兼容 普通对象兼容 函数兼容 参数数量不一致 参数类型不一致 返回不同 类型兼容 因为JS语言不慎过于领过, 真实开发场景中往往无法做到严格一致的类型约束,此时TS就不得不做类型兼容 顶类型:unknown -- 任何类型都可以赋值给unknown 底类型:never -- never兼容任何类型(可以赋值给任何类型) any: 其实不是一个类型,它是一个错误关闭器,用了any就等同于放弃了类型约束 简单类型兼容 子集可以赋值给父级 type name = string

  • C语言指针数组案例详解

    指针与数组是 C 语言中很重要的两个概念,它们之间有着密切的关系,利用这种 关系,可以增强处理数组的灵活性,加快运行速度,本文着重讨论指针与数组之 间的联系及在编程中的应用. 1.指针与数组的关系 当一个指针变量被初始化成数组名时,就说该指针变量指向了数组.如: char str[20], *ptr; ptr=str; ptr 被置为数组 str 的第一个元素的地址,因为数组名就是该数组的首地址, 也是数组第一个元素的地址.此时可以认为指针 ptr 就是数组 str(反之不成立), 这样原来对数

  • MySql数据类型教程示例详解

    目录 1.简要概述 2. MySQL数据类型详解 1) 字符串类型 2) 整数类型 3)浮点数类型 4)日期/时间类型 1.简要概述 为什么要开通MySQL这个学习板块呢?因为这是一名数据分析师必要的一项技能.分析数据什么最重要?当然是数据,既然如此!在数据呈现爆发式增长的年代,怎么能够不学学数据库呢?其实这也是很多读者朋友希望看到的,也是他们建议我写的. 难者不会,会者不难!其实网上很多MySQL的总结文章,不可否认,知识点写的都很全,但是呢!这个只是会使用MySQL数据库的朋友的一个查询手册

  • Go语言基础反射示例详解

    目录 概述 语法 一.基本操作 二.修改目标对象 三.动态调用方法 总结 示例 概述 在程序运行期对程序动态的进行访问和修改 reflect godoc: https://golang.org/pkg/reflect/ reflect包有两个数据类型: Type:数据类型 [reflect.TypeOf():是获取Type的方法] Value:值的类型[reflect.ValueOf():是获取Value的方法] 语法 一.基本操作 获取变量类型 func TypeOf(i interface{

  • Go语言字符串基础示例详解

    目录 包含 Contains(s,substr string) bool ContainsAny(s, chars string) bool 统计 Count(s, substr string) int 比较 EqualFold(s, t string) bool HasPrefix(s, prefix string) bool HasSuffix(s, suffix string) bool 分割 Fields(s string) []string 下标 Index(s, sep string

  • C语言 指针数组进阶详解

    目录 指针与数组中的sizeof与strlen sizeof strlen 数组名 1.一维数组 整型数组 字符数组 指针数组 2.二维数组 指针笔试题 笔试题1 笔试题2 笔试题3 笔试题4 笔试题5 前言:指针与数组的知识往往让我们无法给自己定位,似乎是懂了,但真的碰上了又一言难尽.接下来有一些关于指针与数组的知识和例题讲解,来看看你对指针和数组到底有多了解吧! 指针与数组中的sizeof与strlen sizeof sizeof值关注占用空间的大小,单位是字节,不关注元素的类型,是一个操作

随机推荐