c语言指针是什么意思

C语言的指针类型详解

C语言的指针类型包括两方面的信息:一是地址,存放在指针变量中;二是类型信息,关乎于读写的长度,没有存储在指针变量中,位于用该指针读写时的mov指令中,不同的读写长度对应的mov指令不同。以下是搜索整理的关于C语言的指针类型详解,需要的朋友可以参考一下!想了解更多相关信息请持续关注我们应届毕业生考试网!

C语言的指针类型详解1

指针存储了内存的地址,同时指针是有类型的,如int*,float*,那么,一个自然的猜想就是指针变量应该存储这两方面的信息:地址和指针类型,比如,就像下面的结构体:

代码如下:

struct pointer{

long address;

int type;

}

举个例子:打印sizeof(int*),值为4,可见4字节是存储内存地址用的,反过来就说明指针并没有存储类型信息的地方,那么指针的类型信息存放在哪儿呢?

下面剖析一段简单的代码。

代码如下:

// ma.cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"

char gi;

char *pi;

void main()

{

pi=&gi;

*pi=12;

}

反汇编结果:

代码如下:

pi=&gi;

0041137E C7 05 78 71 41 00 7C 71 41 00 mov dword ptr [pi (417178h)],offset gi (41717Ch)

*pi=12;

00411388 A1 78 71 41 00 mov eax,dword ptr [pi (417178h)]

0041138D C6 00 0C mov byte ptr [eax],0Ch

}

可见byte就说明了指针类型的信息。

总结:C语言的指针类型包括两方面的信息:一是地址,存放在指针变量中;二是类型信息,关乎于读写的长度,没有存储在指针变量中,位于用该指针读写时的mov指令中,不同的读写长度对应的mov指令不同。

另外:在指针强制转换时,也是这个原理。就是指针强制转换的影响不是在转换的'时候发生,而是在用转换后的身份去访问内存时体现到了指令中。

那么指针在什么情况下转换是安全的呢?就是看用这个转换后的身份去访问内存是否安全。

简要的说有以下原则:如果转换后指针指向的数据类型大小小于原数据类型大小,那么用该转换后的指针访问就不会越过原数据的内存,是安全的,否则危险,要越界。

[C语言的指针类型详解]相关文章:

1.C语言的指针

2.C语言中指针与数组的详解及区别

3.如何理解C语言指针

4.如何使用C语言数组指针

5.C语言指针知识点

6.Swift与C语言指针结合使用实例

7.C语言指针的概念

8.C语言复杂指针是什么

9.C语言中指针高级用法介绍

10.C语言中的指针是什么

C语言的指针类型详解2

在C语言中,函数的参数不仅可以是整数、小数、字符等具体的数据,还可以是指向它们的指针。用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着函数的结束而被销毁。

像数组、字符串、动态分配的内存等都是一系列数据的集合,没有办法通过一个参数全部传入函数内部,只能传递它们的指针,在函数内部通过指针来影响这些数据集合。

有的时候,对于整数、小数、字符等基本类型数据的操作也必须要借助指针,一个典型的例子就是交换两个变量的值。

有些初学者可能会使用下面的方法来交换两个变量的值:

#includevoid swap(int a, int b){ int temp; //临时变量 temp = a; a = b; b = temp;}int main(){ int a = 66, b = 99; swap(a, b); printf("a = %d, b = %dn", a, b); return 0;}

运行结果:

a = 66, b = 99

从结果可以看出,a、b 的值并没有发生改变,交换失败。这是因为 swap() 函数内部的 a、b 和 main() 函数内部的 a、b 是不同的变量,占用不同的内存,它们除了名字一样,没有其他任何关系,swap() 交换的是它内部 a、b 的值,不会影响它外部(main() 内部) a、b 的值。

改用指针变量作参数后就很容易解决上面的问题:

#includevoid swap(int *p1, int *p2){ int temp; //临时变量 temp = *p1; *p1 = *p2; *p2 = temp;}int main(){ int a = 66, b = 99; swap(&a, &b); printf("a = %d, b = %dn", a, b); return 0;}

运行结果:

a = 99, b = 66

调用 swap() 函数时,将变量 a、b 的地址分别赋值给 p1、p2,这样 *p1、*p2 代表的就是变量 a、b 本身,交换 *p1、*p2 的值也就是交换 a、b 的值。函数运行结束后虽然会将 p1、p2 销毁,但它对外部 a、b 造成的影响是“持久化”的,不会随着函数的结束而“恢复原样”。

需要注意的是临时变量 temp,它的作用特别重要,因为执行*p1 = *p2;语句后 a 的值会被 b 的值覆盖,如果不先将 a 的值保存起来以后就找不到了。

用数组作函数参数

数组是一系列数据的集合,无法通过参数将它们一次性传递到函数内部,如果希望在函数内部操作数组,必须传递数组指针。下面的例子定义了一个函数 max(),用来查找数组中值最大的元素:

#includeint max(int *intArr, int len){ int i, maxValue = intArr[0]; //假设第0个元素是最大值 for(i=1; i<len; i++){ if(maxValue < intArr[i]){ maxValue=intArr[i]; } } return maxValue;}int main(){ int nums[6], i, maxValue; int len=sizeof(nums)/sizeof(int); //读取用户输入的数据并赋值给数组元素 for(i=0; i<len; i++){ scanf("%d", nums+i); } printf("Max value is %d!n", max(nums, len)); return 0;}

运行结果:

12 55 30 8 93 27↙

Max value is 93!

参数 intArr 仅仅是一个数组指针,在函数内部无法通过这个指针获得数组长度,必须将数组长度作为函数参数传递到函数内部。数组 nums 的每个元素都是整数,scanf() 在读取用户输入的整数时,要求给出存储它的内存的地址,nums+i就是第 i 个数组元素的地址。

用数组做函数参数时,参数也能够以“真正”的数组形式给出。例如对于上面的 max() 函数,它的参数可以写成下面的形式:

int max(int intArr[6], int len){ int i, maxValue = intArr[0]; //假设第0个元素是最大值 for(i=1; i<len; i++){ if(maxValue < intArr[i]){ maxValue=intArr[i]; } } return maxValue;}

int intArr[6]好像定义了一个拥有 6 个元素的数组,调用 max() 时可以将数组的所有元素“一股脑”传递进来。

读者也可以省略数组长度,把形参简写为下面的形式:

int max(int intArr[], int len){ int i, maxValue = intArr[0]; //假设第0个元素是最大值 for(i=1; i<len; i++){ if(maxValue < intArr[i]){ maxValue=intArr[i]; } } return maxValue;}

int intArr[]虽然定义了一个数组,但没有指定数组长度,好像可以接受任意长度的数组。

实际上这两种形式的数组定义都是假象,不管是int intArr[6]还是int intArr[]都不会创建一个数组出来,编译器也不会为它们分配内存,实际的数组是不存在的,它们最终还是会转换为int *intArr这样的指针。这就意味着,两种形式都不能将数组的所有元素“一股脑”传递进来,大家还得规规矩矩使用数组指针。

int intArr[6]这种形式只能说明函数期望用户传递的数组有 6 个元素,并不意味着数组只能有 6 个元素,真正传递的数组可以有少于或多于 6 个的元素。

需要强调的是,不管使用哪种方式传递数组,都不能在函数内部求得数组长度,因为 intArr 仅仅是一个指针,而不是真正的数组,所以必须要额外增加一个参数来传递数组长度。

C语言为什么不允许直接传递数组的所有元素,而必须传递数组指针呢?

参数的传递本质上是一次赋值的过程,赋值就是对内存进行拷贝。所谓内存拷贝,是指将一块内存上的数据复制到另一块内存上。

对于像 int、float、char 等基本类型的数据,它们占用的内存往往只有几个字节,对它们进行内存拷贝非常快速。而数组是一系列数据的集合,数据的数量没有限制,可能很少,也可能成千上万,对它们进行内存拷贝有可能是一个漫长的过程,会严重拖慢程序的效率,为了防止技艺不佳的程序员写出低效的代码,C语言没有从语法上支持数据集合的直接赋值。

除了C语言,C++、Java、Python 等其它语言也禁止对大块内存进行拷贝,在底层都使用类似指针的方式来实现。

c语言指针是什么意思

转载请注明出处记得学习 » c语言指针是什么意思

学习

指针的各种意思

阅读(97)

本文为您介绍指针的各种意思,内容包括指针的解释及造句,指针的名词解释是什么,指针的造句大全。指针的解释及造句造句指懂得并使用字词,按照一定的句法规则造出字词通顺、意思完整、符合逻辑的句子。依据现代语文学科特征,可延伸为写段、

学习

足疗店个人职位晋升申请书范文

阅读(117)

本文为您介绍足疗店个人职位晋升申请书范文,内容包括职位晋升调动申请书(精选),职位晋升申请书用手写还是电子,医生职位调动申请书。职位晋升调动申请书(精选10篇)当下市场经济活跃,交易频繁,我们每个人都可能要用到申请书,写申请书的时候要注

学习

春节放假通知通用

阅读(141)

本文为您介绍春节放假通知通用,内容包括春节放假停止收货通知(通用),放假通知汇编9篇,过年放假停止收货通知。春节放假停止收货通知(通用5篇)在当今社会生活中,我们都不可避免地要接触到通知,通知是运用广泛的知照性公文。大家知道正式的通知

学习

万能淘宝好评语通用

阅读(134)

本文为您介绍万能淘宝好评语通用,内容包括收货后给淘宝的好评语大全,淘宝给买家的评语大全,淘宝的评语给错了怎么处理。收货后给淘宝的好评语大全在学习、工作、生活中,大家都不可避免地要接触到评语吧,评语于细微之处肯定被评价对象的进

学习

小班语言教案小草青青故事

阅读(115)

本文为您介绍小班语言教案小草青青故事,内容包括小草青青教案(精选),小草青青科学教案,小草青青幼儿园教案反思。小草青青教案(精选7篇)作为一位优秀的人民教师,时常要开展教案准备工作,教案有助于顺利而有效地开展教学活动。教案要怎么写呢?以

学习

淘宝收货评价语

阅读(124)

本文为您介绍淘宝收货评价语,内容包括淘宝收货评价语通用,淘宝收货后多久不能评价,淘宝确认收货评价后还能退货吗。淘宝收货评价语通用导语:淘宝是目前时下最流行的购物方式,无论什么产品一般都能在淘宝上找到,并且物美价廉。以下是整理

学习

蝉蜕的功效与作用及禁忌症

阅读(157)

本文为您介绍蝉蜕的功效与作用及禁忌症,内容包括蝉蜕的功效与作用及禁忌,蝉蜕防风功效与作用及禁忌,蝉蜕的功效与作用禁忌。蝉蜕的功效与作用及禁忌蝉蜕为蝉科昆虫黑蚱羽化后的蜕壳,蝉蜕的功效是宣散风热,透疹利咽,退翳明目,蝉蜕的作用

学习

鼠标指针移动停顿是什么原因

阅读(131)

本文为您介绍鼠标指针移动停顿是什么原因,内容包括解决鼠标指针移动时出现停顿卡的原因,鼠标指针移动卡顿怎么解决,鼠标指针会有间歇停顿。解决鼠标指针移动时出现停顿卡的原因通常,鼠标发生停顿是鼠标的灵敏度变差,灵敏度变差是光电鼠标

学习

青岛学农实践基地

阅读(115)

本文为您介绍青岛学农实践基地,内容包括学农实践活动总结,学农总结感受300字,初中学农总结400字。学农实践活动总结一个精彩的活动已经圆满收官,相信你一定有很多值得分享的经验,让我们一起来学习写活动总结吧。那如何写一篇漂亮的活动总

学习

小班社会穿鞋袜比赛教案

阅读(100)

本文为您介绍小班社会穿鞋袜比赛教案,内容包括小班社会公开课我会穿鞋脱袜教案(精选),小班社会穿脱鞋袜教案及反思,健康课穿脱袜子小班教案。小班社会公开课我会穿鞋脱袜教案(精选8篇)教案是教师为顺利而有效地开展教学活动,根据课程标准,教学

学习

干农活作文

阅读(104)

本文为您介绍干农活作文,内容包括干农活作文(精选),国庆干农活作文大全,干农活作文1000字。干农活作文(精选23篇)在生活、工作和学习中,许多人都写过作文吧,借助作文人们可以实现文化交流的目的。相信许多人会觉得作文很难写吧,下面是收集整理

学习

按时长大生日快乐文案

阅读(115)

本文为您介绍按时长大生日快乐文案,内容包括叮叮叮按时长大生日快乐文案(精选),按时长大儿童生日快乐文案,叮叮叮按时长大百天文案。叮叮叮按时长大生日快乐文案(精选55句)在日常学习、工作和生活中,越来越多人钟情于在网上发布文案,文案用于

学习

国庆干农活作文大全

阅读(129)

本文为您介绍国庆干农活作文大全,内容包括干农活作文,干农活作文300字,干农活作文1000字。干农活作文14篇在学习、工作或生活中,说到作文,大家肯定都不陌生吧,作文是人们把记忆中所存储的有关知识、经验和思想用书面形式表达出来的记叙方式

学习

三年级音乐钟声叮叮当教学反思

阅读(134)

本文为您介绍三年级音乐钟声叮叮当教学反思,内容包括钟声叮叮当教学反思,钟声叮叮当教学设计及反思,三年级钟声叮叮当教学反思。钟声叮叮当教学反思作为一位刚到岗的人民教师,我们的工作之一就是课堂教学,教学反思能很好的记录下我们的课

学习

指针的各种意思

阅读(97)

本文为您介绍指针的各种意思,内容包括指针的解释及造句,指针的名词解释是什么,指针的造句大全。指针的解释及造句造句指懂得并使用字词,按照一定的句法规则造出字词通顺、意思完整、符合逻辑的句子。依据现代语文学科特征,可延伸为写段、

学习

小班语言教案小草青青故事

阅读(115)

本文为您介绍小班语言教案小草青青故事,内容包括小草青青教案(精选),小草青青科学教案,小草青青幼儿园教案反思。小草青青教案(精选7篇)作为一位优秀的人民教师,时常要开展教案准备工作,教案有助于顺利而有效地开展教学活动。教案要怎么写呢?以

学习

各种品牌口号类型

阅读(141)

本文为您介绍各种品牌口号类型,内容包括各品牌公司口号,一个公司的品牌口号,平安的品牌口号。各品牌公司口号在学习、工作或生活中,许多人都接触过一些比较经典的口号吧,不同时期不同的口号可以看出,意识对物质具有能动作用。那什么样的口

学习

小班语言啪啦啪啦砰的反思

阅读(107)

本文为您介绍小班语言啪啦啪啦砰的反思,内容包括啪啦啪啦——砰中班语言活动教案,中班噼里啪啦教案,中班语言吧嗒吧嗒教案。啪啦啪啦——砰中班语言活动教案作为一名默默奉献的教育工作者,通常需要用到教案来辅助教学,教案有助于学生理解

学习

啪啦啪啦嘭中班语言教案和评语

阅读(213)

本文为您介绍啪啦啪啦嘭中班语言教案和评语,内容包括中班语言优质教案《啪啦啪啦——砰》(精选),中班语言活动啪啦啪啦嘭课件,中班语言活动啪啦啪啦砰绘本反思。中班语言优质教案《啪啦啪啦——砰》(精选12篇)作为一名人民教师,常常要根据教

学习

中班语言活动啪啦啪啦教案

阅读(125)

本文为您介绍中班语言活动啪啦啪啦教案,内容包括啪啦啪啦——砰中班语言活动教案,啪啦啪啦砰教案,啪啦啪啦砰教案反思。啪啦啪啦——砰中班语言活动教案作为一名默默奉献的教育工作者,通常需要用到教案来辅助教学,教案有助于学生理解并掌

学习

渤海湾产区的气候类型

阅读(123)

本文为您介绍渤海湾产区的气候类型,内容包括渤海湾的气候特点有哪些,周五渤海湾气候怎样,渤海湾属于什么气候。渤海湾的气候特点有哪些渤海湾,中国渤海三大海湾之一。位于渤海西部。北起河北省乐亭县大清河口,南到山东省黄河口。有蓟运河

学习

不同类型的寸头

阅读(698)

本文为您介绍不同类型的寸头,内容包括四种不同寸头类型介绍,不同长度寸头对比,长寸头类型。四种不同寸头类型介绍寸头是检验帅哥的唯一标准,寸头简单、阳光、干净,确实是男生的首选发型,对于上班族和学生更是最容易打理的发型。那么下面就