C中这种该死的术语有很多,一直也不知道该怎么去理解,真是头疼死了,今天参考了网上的一些文章,自己写了一个小程序,算是有点理解。
先来介绍一下指针: 指针一种类型,理论上来说它包含其他变量的地址,因此有的书上也叫它:地址变量。既然指针是一个类型,是类型就有大小,在达内的服务器上或者普通的PC机 上,都是4个字节大小,里边只是存储了一个变量的地址而已。不管什么类型的指针,char * ,int * ,int (*) ,string * ,float * ,都是说明了本指针所指向的地址空间是什么类型而已,了解了这个基本上所有的问题都好象都变的合理了 。
****下面摘抄了 酸菜猪蹄的程序人生 的内容
指针数组 ,故名思义,就是指针的数组,数组的元素是指针 ;
数组指针 ,同样,就是指向数组的指针 。
简单举例说明:
int *p[2]; 首先声明了一个数组,数组的元素是int型的指针。
int (*p)[2]; 声明了一个指针, 指向了一个有两个int元素的数组。
其实这两种写法主要是因为运算符的优先级, 因为[]的优先级比*高。所以第一种写法,p先和[]结合,所以是一个数组,后与*结合,是指针。后一种写法同理。
指针数组如下处理就会很清楚:
typedef int* intPtr;
intPtr p[2];
一目了然,所以为了避免迷惑,做适当的typedef也是很有必要的。
同理,数组指针也可以作类似处理:
typedef int intArray2[2];
intArray2 * p;
和原来的声明都是等价的。
******
例子:
1 #include<stdio.h>
2 /*其实C/C++中没有那么多的术语,
3 估计有些所谓的高人为了学习所谓fd--file directory简写
4 ,最终带来的是更多的误解
5 */
6
7 //----说到指针数组就想到main函数中的参数char **argv 的使用就可以了!!
8 int main(int argc ,char **argv )
9 {
10 char *ch[3]; //a array who's content is pointers
11 //指针数组,数组元素为指针的数组,等效形式如下
12 /*typedef char* intPtr;
13 intPtr ch[3];
14 */
15
16 //数组指 针
17 //就是指向数组的指针
18 //不是指向元素的指针,于char *ch ="hello",不一样,加1移动的位置也不一样,数组指针加1移动整个数组的长度
19 char (*pt)[30] = "hello world!"; //a pointer who point a array
20 /*
21 typedef char intArray[3];
22 intArray *pt; //指针pt指向数组intArray[3]
23 */
24
25
26 //-测试指针数组 -----init the var初始化变量
27 ch[0] = "hello";
28 ch[1] = "world";
29 ch[2] = "haha";
30 printf("ch is %s /n" ,ch); // warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char **’
31 printf("the content of the ch[0] is %s /n" ,ch[0]);
32 printf("the content of the ch[1] is %s /n" ,ch[1]);
33 printf("the content of the ch[2] is %s /n" ,ch[2]);
34 //---测试数组指针 --
35 printf("the position of the pt is %p/n" ,pt); //测试数组指针加1的位置
36 printf("the position of the pt +1 is %p/n" ,(pt +1));
37 char *ch1 = (char *)pt;
38
39 printf("the position of the pt is %p/n" ,ch1);
40 printf("the position of the pt is %p/n" ,(ch1 + 1)); //测试数组指针强制转换成字符指针之后加1的位置
41
42 printf("the first of the array is %c /n" ,*pt);
43 printf("the second of the array is %c /n " ,*(pt +1));
44
45 printf("the first of the array is %c /n" ,*ch1); //输出数组指针强制转换成字符指针后的内容
46 printf("the first of the array is %c /n" ,*(ch1 + 1));
47 }
编译 :
magic@ubuntu:~/work$ gcc array_pt.c
array_pt.c: In function ‘main’:
array_pt.c:19 : warning: initialization from incompatible pointer type
array_pt.c:30 : warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char **’
array_pt.c:42 : warning: format ‘%c’ expects type ‘int’, but argument 2 has type ‘char *’
array_pt.c:43 : warning: format ‘%c’ expects type ‘int’, but argument 2 has type ‘char *’
运行结果 ;
ch is ��� �K���@�
the content of the ch[0] is hello
the content of the ch[1] is world
the content of the ch[2] is haha
the position of the pt is 0x80485f0
the position of the pt +1 is 0x804860e //加1之后,正好是整个数组的长度30
the position of the pt is 0x80485f0
the position of the pt is 0x80485f1
the first of the array is �
the second of the array is
the first of the array is h
the first of the array is e
参考文章:
http://www.cppblog.com/cooleaf/archive/2006/05/19/7418.html
http://www.cnblogs.com/ForEverKissing/archive/2008/07/21/1247633.html