指针数组和数组指针(一)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值