指针不再是你的拦路虎....................千万不可错过!!

    不得不说,指针对于学习c/c++的人而言的确是一个头疼但是又特别重要一个问题,在这里,我就将自己的学习经验分享给大家,希望能够帮助更多的人学习。说起指针,或许你还在为到底什么是指针?指针和数组到底是否相等?指针数组是什么?数组指针是什么?函数指针又是什么?函数指针数组,函数指针数组指针它们又是什么?看完这个你就会对指针有更深一步的了解了,下面我为大家一一解答。

1、什么是指针?

要想明白什么是指针首先看这样一个例子:int *a;

...

*a=12;

先想一下,这段代码是否正确?其实这段代码是错误的,它首先声明创建了一个指针变量a,最后的语句是想将12存储在a所指向的内存里,这里的*就代表a是一个指针,它是一个指向4个字节的整型变量,*就好像是防盗门的锁芯,没有这个*,我们就不能读或者写这块内存。代码错误的地方就是声明a这个指针变量的时候,我们没有对它进行初始化,所以我们没有办法预测12这个值将会存储在什么地方,因为我们不知道a到底指向哪里。

所以,一个变量的地址称为该变量的”指针“,指针变量就是专门用来存放另一变量的地址(即指针)的变量,指针变量的值就是地址,占4个字节。所以以后在对指针进行间接访问或者解引用之前,一定要确保他们被初始化,所以以后再声明指针变量的时候最好同时对其初始化。

2、指针和数组是否相等?

实际上,指针和数组并不相等,虽然它们在很多时候是可以互用的。如果你还是对这个结论存有疑虑,那么请看下面的例子:

int   a[5];

int    *b;

这两行代码都是声明,并且a与b都具有指针值,因为数组名a代表数组首元素的地址即a[0]的地址,b是一个指针变量,而且它们都可以进行解引用和下标引用操作,但是这也不能代表他们是相等的。因为声明一个数组的时候,编译器会根据声明所指定的元素数量为数组保留相应的内存,然后再创建数组名;而声明一个指针变量时,编译器只给指针本身保留内存空间,它并不为任何整型值分配内存空间,而且,指针变量并未被初始化为指向任何现有的内存空间,如果它是一个自动变量,它甚至不会被初始化。

所以上式*a是完全合法的。*b却是非法的,它将访问内存中某个不确定的位置,或者导致程序终止。此外,b++可以通过编译,a++却不行,因为a是个常量值,它代表数组首元素的地址。因此指针和数组不相等。

指针变量在32位系统下永远只占4个字节,它的值为某一内存的地址。数组的大小与元素的类型和个数有关,定义数组时必须指明元素的类型和个数,数组可以存任何类型的数据,但是不能存函数。

3、指针数组是什么?数组指针是什么?

指针数组它首先是一个数组,数组的元素都是指针,数组占多少字节由数组本身决定。数组指针首先它是一个指针,它指向一个数组,在32位系统下永远只占4个字节。这里,我们需要知道[ ]的优先级高于*,而()得优先级又高于[ ],所以我们就很容易就可以判断出int  *p1[10];是一个指针数组,int  (*p2)[10];是一个数组指针。

4、函数指针是什么?

函数指针就是函数的指针,它是一个指针,指向一个函数。下面我们看一个函数指针应用的例子:

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

char *fun(char *p1, char * p2)

{

int i = 0;

i = strcmp( p1, p2 );

if (0 == i)

{

return p1 ;

}

else

{

return p2 ;

}

}

int main()

{

char *(*pf)(char *p1, char *p2);   //通过(*pf)取出存在这个地址上的函数即fun函数,然后调用它。

pf = &fun;

(*pf)( "aa", "bb" );

system( "pause");

return 0;

}

在这里,我们有必要看一个有趣的例子:(*(void(*)( ))0) ( );看一下。你是否能看懂它代表的是什么?看不懂别着急,我会慢慢剖析给你看,然后你就会觉得它也没有表面上看着那么难懂了。  (    *(void   (*)  ( )   )0     )   ( );这样将上面代码分隔开来,看起来是不是好看多了?

1、 void(*)( )这是一个函数指针类型,这个函数没有参数,也没有返回值。

2、(void(*)( ))0这是将0强制类型转换函数指针类型,这里的0不同于寻常的0,它在这里是一个地址,即一个函数保存在一段首地址为0的区域中。

3、(*(void(*)( ))0)这是对上面所说的进行了解引用。

4、(*(void(*)( ))0) ( )这是函数调用。

5、函数指针数组是什么?函数指针数组指针又是什么?

char *(*pf[3])(char *p);这段代码就是定义函数指针数组,它是一个数组,数组名为pf,数组内存储了三个指向函数的指


针,这些指针指向一些返回值类型为指向字符的指针,参数为一个指向字符的指针的函数,这样分析起来是不是容易理解多了。其实还有一个简单的方法就是倒着看,它先是数组,然后它存储了指针,这些指针又指向函数。

函数指针数组指针实际上就是一个指针,这个指针指向了一个数组,这个数组里面存储的是指向函数的指针,它同样也可以利用我上面所说的倒着看的方法进行分析。

时间: 2024-10-10 13:19:47

指针不再是你的拦路虎....................千万不可错过!!的相关文章

不再年轻的程序员--千万不要轻易转行

一晃眼就28了,之前觉得自己还很年轻,现在时光如梭,觉得自己年轻不再了,看到公司的那些雨后春笋般的程序员在觉得自己有点不知所措了. 之前觉得自己年轻,觉得什么感兴趣就去做什么,一切都非常的随性. 本科的时候,觉得硬件很感兴趣,所有的经历都放在电子电路相关的领域.读研的时候,跟的导师是做激光器与激光加工设备的,结果被安排做激光三维加工的控制设备.整天的工作就是电机的控制以及图形图像处理,另外也学习了不少了激光知识.因为一些原因,期间对图像算法非常感兴趣,于是工作的时候就只找相关的领域.也算是有幸去

仅此一次对BMP文件做详细分析的机会,想了解的朋友千万不能错过

什么是BMP?BMP是一种与硬件设备无关的图像文件格式,使用非常广.它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BblP文件所占用的空间很大.BMP文件的图像深度可选lbit.4bit.8bit及24bit.BMP文件存储数据时,图像的扫描方式是按从左到右.从下到上的顺序.由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式.典型的BMP图像文件由三部分组成:位图文件头数据结构,它包含BM

愚人节营销可以这么做,下一次千万别错过了

在每年4月1日愚人节的时候,全球不少企业都会搞一些市场活动,习惯性地跟市场开一把玩笑,除了"刷存在感"这个战术目的之外,其实还可以额外充当新产品的试金石.与此类似,不少男生在这一天向心爱的女生表白,不论女生同意与否,男生都可以进退自如. 文/张书乐 原载于<人民邮电报>2016年12月2日<乐游记>专栏124期 或许你会说,不就是上期专栏里提到<星际争霸2>的愚人节玩笑,后来在万达的玩具里被疑似借鉴了吗?其实不然,谷歌2014年开了个玩笑,结果201

【iOS9走过路过千万不要错过】iOS 9 Day-by-Day::index

原文地址 欢迎大家阅读iOS9 Day-by-Day,你将在文末,看到这一系列所有的博文的链接.当然,如果你愿意可以学习这一系列以前的文集iOS7和 iOS8 系列. iOS9 Day-by-Day 是一个系列博客文集,内容囊括了开发者需要了解的 iOS9 相关的新技术.新API.本文是这一系列博客的索引页,确保你不会错过任何一天的文章. 关于作者 本系列文章是来自shinobicontrols 的开发者 Chris Grant 写的.(注 iOS7 和 iOS8 系列是Sam Davies 写

看见一个过目不忘的女生,怎么才能要到联系方式?千万别错过

你有没有过这样的经历一天下午你在学校的小路上散步的时候,前面一块假山石上坐着一个低年级的美女拿着一本书在看. 她满头飘逸的长发,上身是性感的吊带,下身短短裙包裹着一双修长的美腿.你绕到她的前面,想看看她的脸是不是也像身材那样美丽,哇,怎样的一张超凡脱俗的脸.她整个人都是你梦中情人的样子.你不自觉放慢了脚步,想在她的身前多停留一些时间,好多欣赏一会儿她那美妙的身材和娴静的气质. 她稍微抬起了头,好像注意到了你.你正面看到了她那双天真无邪的大眼睛,像两泓秋水注入到了你的内心深处.你一瞬间感觉到一股难

5款高逼格实用手机APP推荐,千万不能错过!

今天和大家分享下小编压箱底的一些小众APP,这些APP兼具实用和风格,一定会为你的手机添色不少,赶快来看看吧! 小目标 一款全新的生活实用服务APP,致力于培养用户的打卡习惯,每天坚持打卡,严格执行自己的目标,并记录成长.藏书馆 一款阅读APP,黑白简约的设计风格,拥有海量的书籍,最大的亮点是看书全免费!Mark APP内列了很多观影清单,并且每部电影都聚合了播放源.此外,还可以自己制作电影剧照+台词的海报卡片,非常方便.MOZIK 一款超个性的音乐APP,根据用户选择的不同心情来推荐歌曲,歌曲

【转】 指针函数与函数指针的区别

一. 在学习arm过程中发现这“指针函数”与“函数指针”容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义: 1.指针函数是指带指针的函数,即本质是一个函数.函数返回类型是某一类型的指针 类型标识符    *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个地址值.函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量. 表示: float *fun();

函数指针与指针函数

一. 在学习arm过程中发现这“指针函数”与“函数指针”容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义: 1.指针函数是指带指针的函数,即本质是一个函数.函数返回类型是某一类型的指针 类型标识符    *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个地址值.函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量. 表示: float *fun();

深入理解指针—&gt;指针函数与函数指针的区别

一. 在学习过程中发现这"指针函数"与"函数指针"容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义: 1.指针函数是指带指针的函数,即本质是一个函数.函数返回类型是某一类型的指针 类型标识符    *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个地址值.函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量. 表示: f