数组指针与指针数组的问题

明天考二级C语言机试,复习的时候发现自己基础知识有个漏洞哦哦哦哦,是指针数组和数组指针的:

 1 void fun(char (*ss)[20])
2 {
3 int len = strlen(ss[2]);
       char c = ss[2][3];
4 }
5
6 void main()
7 {
8 char ss[10][20];
       ....
9 fun(ss);
10 }

 

其中fun函数的参数ss便是一个数组指针.采用

char* ss

char* ss[]

都是错误的(可以用char ss[10][20]),首先编译上通不过,本质上的原因是:

int* a[]; a是指针数组.

int b[10][20], (*c)[20] = b; b,c都是数组指针,即:A pointer to an array.有时也称为“行指针”,因为通过它能直接引用b某一行的元素.

int d=3, *e = &d; e是指向普通单个元素的指针.

这就是三者的概念之分。

 

上面的fun不能使用指针数组,因为实参ss是数组指针,也不能使用普通指针,因为fun中对ss中的元素进行定位时,编译器规定了某些东西,如下:

(*c)[10]用于告诉编译系统,它是一个指针,指向一个长度为10的整型数组。这样在用指针访问其所指向的内存单元的时候就可以用*(*(c+i)+j)来表示b[i][j];
若使用普通指针e,就需用:*(e+3*i+j)来表示b[i][j].

 

 最根本的一点是,数组指针和普通指针是不同级别的指针,如前面的e是个一级指针,指针移动的间距是一个整型,而c是二级指针,移动间距是十个整型。故我们能通过c[i]直接访问b的某行:

But,   how   will   you   declare   a   Pointer   to   an   Array   of   Integers?  
It   will   look   like   this:  
int   (*iMyVar)[10];  
iMyVar   is   now   a   Pointer   to   an   array   of   10   integers.  
By   the   way,   what   is   the   difference   between   Pointer   to   integer   and   pointer   to   an   array   of   integers?   Well,   it   is   slightly   out   of   the   topic;   In   simpler   terms,  
int   *p;   p++;   increments   address   in   p   by   the   size   of   integer   whereas,
int   (*ap)[10];   p++   ;   increments   address   in   p   by   (10*size   of   integer).
ap   points   to   10   element   int   array,
p   points   to   an   int.

 

The   c++   programming   language:
int   v[]={1,2,3,4};
int   *p1=v;        //pointer   to   initial   element   (implicit   conversion)

int   *p2=&v[0];     //pointer   to   initial   element  


char   v[]= "Annemarie ";
char   *p=v;    //implicit   conversion   of   char[]   to   char*

 

可以看出,数组指针转化为普通指针(不同级别的转换),编译器那是做了手脚的.

 

 

 

转载于:https://www.cnblogs.com/mavaL/archive/2011/11/05/2237300.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值