2015年(12)
分类: LINUX
2015-08-02 19:06:24
一:指针与数组
(1)指针与一维数组:数组名实际上就是指向数组第一个元素的指针,我们可以用数组名来遍历数组。看下面代码:
点击(此处)折叠或打开
我们可以用数组名来直接作为指针(8#),也可以将数组名赋给我们提前准备好的指针p(10#)。并且由于数组的所有元素在逻辑上是按顺序存放的,所以p指向数组中的一个元素,而p+1就指向它的下一个元素。但是我们不能依次对a++来取得后续元素的值,因为a只表示a[0]元素的地址,这是已经确定了的。还要注意*p++和*++p的不同:
*p++:先取得目前p的值所指向空间的值,然后立马对p的值加1;
*++p:先对目前p的值加1,然后再取P所指向空间的值;
(2)二维数组与指针数组。
点击(此处)折叠或打开
p先与[5]结合,构成拥有5个元素的数组,数组中每个成员都是int *类型的,即都指向一个int元素,也就是a中的对应元素,p作为数组名,就已经是指针的指针了,所以我们可以像注释中那样描述。
注意:区别int(*p)[5] 和int *p[5]的不同:
int(*P)[5]:它是一个指向“拥有五个int类型元素的数组”的指针,长度为1。
int *p[5]:它是一个指针数组,有5个元素,长度为5,每个元素都是指针,并且指向的是int 类型的元素。
二:指针与函数
(1)返回指针的函数: int *f(int,int);
由于()的优先级高于*,所以f会先与()结合构成函数,因此上面的声明说明了函数f的返回值是一个指向int元素的指针,我们在链表的相关操作中就经常这样用,在函数的结尾return回来链表的头指针以便后续操作。
(2)指向函数的指针:int (*f)(int,int);
现在*f的身份发生了变化,它成为了一个指向函数的指针,一个函数的函数名比较特殊,它指向一个函数,是一个指针。现在f指向的这个函数参数为两个int类型元素,函数返回值也为int元素。我们经常把这种指针用在作为函数的形参:
int func(int,int,int(*f)(int,int));
这条函数声明就说明了func函数中的第三个参数是“返回值为int,并且参数为2个int类型元素”的函数,我们需要在声明的时候将函数的描述值说出来,但是在func函数中不一定就需要第三个参数,即就是那个“返回值为int,并且参数为2个int类型元素”的返回值。这也是我们有时候在看一些函数声明的时候会不懂的原因。这个问题我在博客中也说过:http://blog.chinaunix.net/uid-30131847-id-5143800.html
(3)返回指向函数指针的函数:int (*func(int))(int,int);
上面的声明这样理解,func为函数,它是一个只有一个参数,并且为int类型的函数,但是它的返回值是一个函数指针,为int(*)(int,int),这个函数指针指向这样一个函数:返回值为int 类型,参数为两个int类型。(这一点也可以看上面的博客)
三:指针与字符串
点击(此处)折叠或打开
也就是字符串数组名a可以作为指针直接使用。注意:p是指向字符串首地址的,我们可以改变p的位置但是不能对p执行p++操作,可以重新找一个变量,让p借助此变量向后移动,以达到我们遍历的目的。
点击(此处)折叠或打开