二维数组,指针数组和数组指针

二维数组,指针数组和数组指针

http://www.cnblogs.com/birduu/archive/2013/04/04/2999185.html

一、指针数组和二维数组
  我们来定义一个字符型指针数组 p:char* p[3]; 定义之后的内存示意如下:
      
  对于二维数组 char birduu[3][16] = { "birduu.com" , "course textbook" , "free" }; 来说,birduu[0] 的值是字符串 "birduu.com" 的首地址,也就是说,birduu[0] 可以理解成指向字符串 "birduu.com" 第一个元素 'b '的字符型指针。对于指针数组 p 来说,p[0] 是字符型指针,p[0] 的基类型是字符型,它和 birduu[0] 的基类型同为字符型,就可以这样赋值: p[0] = birduu[0]; 此时,p[0] 就指向了字符串 "birduu.com"。同理,执行 p[1] = birduu[1]; p[2] = birduu[2]; 后,p[1] 指向了字符串"course textbook",p[2] 指向了字符串"free"。内存示意图如下:

      此后,就可以用 p 来操作二维数组 birduu 了,如示例栏中所示。
  注意 p 是一个指针数组,数组名是不可以被赋值的,不要写成:p = birduu;

程序实例:

#include<stdio.h>
void main()
{
char birduu[3][16] = {"birduu.com","course textbook","free"};
char* p[3];
p[0]=birduu[0];
p[1]=birduu[1];
p[2]=birduu[2];

printf("%s\n",p[0]);
printf("%c\n",p[0][1]);
printf("%c\n",*(*(p+2)+3));
}

输出为:
birduu.com
i
e

 

二、数组指针和二维数组

数组指针就是指向数组的指针,先来定义一个数组指针变量 p: char (*p)[16]; 
  *p 说明 p 是一个指针变量,char [16] 说明 p 的基类型是包含16个字符型元素的一维数组,也就是说 p 可以指向一个包含16个字符型元素的一维数组。 
  下面来看看怎么用数组指针操作二维数组。我们在 http://birduu.com/260.html 节讲过,可以把二维数组名理解为指向第一个行数组元素的指针变量。二维数组 char birduu[3][16] = { "birduu.com" , "course textbook" , "free" }; 的第一个行数组元素是包含16个字符型元素的一维数组,所以可以把二维数组名 birduu 理解为:指向一维数组 birduu[0] 的指针,其基类型为包含16个字符型元素的一维数组,birduu 的值就为一维数组 birduu[0] 的地址。
  从以上分析我们可以看到,指针 birduu 和 p 的基类型是相同的,因此可以这样赋值:p = birduu; 此时 p 就指向了 birduu[0],由于 p 的基类型是包含16个字符型元素的一维数组,所以指针 (p + 1) 指向 birduu[1],指针 (p + 2) 指向 birduu[2]。内存示意图如下:

 

此后,就可以用 p 来操作二维数组 birduu 了,由于 p 是一个指针变量,所以它引用数组元素时无论用指针法、下标法还是混合法都可以。

程序实例:

#include<stdio.h>

void main()
{
char birduu[3][16] = { "birduu.com" , "course textbook" , "free" };
char (*p)[16];

p = birduu;

printf( "%s\n" , p[0] );
printf( "%c\n" , p[0][1] );
printf( "%c\n" , *( *( p + 2 ) + 3 ) );
printf( "%c\n" , *( p[2] + 3 ) );
printf( "%s\n" , *( p + 1 ) );
}

输出为:

birduu.com
i
e
e
course textbook

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值