指针数组和数组指针

Romi-知行合一

轻轻的风轻轻的梦,轻轻的晨晨昏昏, 淡淡的云淡淡的泪,淡淡的年年岁岁。
posts - 119, comments - 69, trackbacks - 0, articles - 0
   博客园 ::  首页 ::  新随笔 ::  订阅  订阅 ::  管理

指针数组和数组指针的区别

Posted on  2012-01-10 11:15  romi 阅读( 61923) 评论( 10编辑  收藏

这两个名字不同当然所代表的意思也就不同。我刚开始看到这就吓到了,主要是中文太博大精深了,整这样的简称太专业了,把人都绕晕了。从英文解释或中文全称看就比较容易理解。

指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针

数组指针:a pointer to an array,即指向数组的指针

还要注意的是他们用法的区别,下面举例说明。

int* a[4]     指针数组     

                 表示:数组a中的元素都为int型指针    

                 元素表示:*a[i]   *(a[i])是一样的,因为[]优先级高于*

int (*a)[4]   数组指针     

                 表示:指向数组a的指针

                 元素表示:(*a)[i]  

注意:在实际应用中,对于指针数组,我们经常这样使用:

1
2
typedef  int * pInt;
pInt a[4];

这跟上面指针数组定义所表达的意思是一样的,只不过采取了类型变换。

代码演示如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
using  namespace  std;
 
int  main()
{
int  c[4]={1,2,3,4};
int  *a[4]; //指针数组
int  (*b)[4]; //数组指针
b=&c;
//将数组c中元素赋给数组a
for ( int  i=0;i<4;i++)
{
a[i]=&c[i];
}
//输出看下结果
cout<<*a[1]<<endl; //输出2就对
cout<<(*b)[2]<<endl; //输出3就对
return  0;
}

注意:定义了数组指针,该指针指向这个数组的首地址,必须给指针指定一个地址,容易犯的错得就是,不给b地址,直接用(*b)[i]=c[i]给数组b中元素赋值,这时数组指针不知道指向哪里,调试时可能没错,但运行时肯定出现问题,使用指针时要注意这个问题。但为什么a就不用给他地址呢,a的元素是指针,实际上for循环内已经给数组a中元素指定地址了。但若在for循环内写*a[i]=c[i],这同样会出问题总之一句话,定义了指针一定要知道指针指向哪里,不然要悲剧。

类似的还有指针函数和函数指针,遇到了再说吧。

分类:  C/C++
标签:  指针数组数组指针区别
15
1
(请您对文章做出评价)
« 上一篇: C++主要数据类型在计算机中所占字节大小
» 下一篇: 字节存储排序:大端和小端的判别及转换

Feedback

#1楼   

2012-08-24 13:35 by  理工紫   
学习了

#2楼   

2013-09-15 17:33 by  小浪花   
恩,很有帮助 ,谢谢了

#3楼   

2014-05-12 16:54 by  绝影未绝   
很不错!

#4楼   

2014-05-19 11:10 by  cumtchw   
但若在for循环内写*a[i]=c[i],这同样会出问题。
我是菜鸟,这一句不明白

#5楼   

2014-06-05 17:41 by  雨中的路   
@cumtchw
首先数组a中存放的是指针,即应该是一个整型变量的地址。
那么 *a[i]=c[i] 语句的意思就是将c[i]这个整型变量的值 赋给 地址为a[i]一个整型变量。
但是注意此时数组a中的a[i]指针变量的值并没有赋值,那么就是对一个未知的地址取值,那么根本就无法找到*a[i]这个变量,又怎么将c[i]的值赋给*a[i]呢。
以上是我的理解,不一定保证绝对正确。
ps:你可以在编译器上单步调试一下,看一下a[i]里面的存放的地址的值的变化就可以了。

#6楼   

2015-02-06 09:46 by  guohuihui   
错误

#7楼   

2015-03-18 15:21 by  Jacy_liu   
@cumtchw
因为你的a[i]中装的是地址(指针),你在未对指针初始化的情况下就对它指向的单元赋值,是不可行的。写的有点拗口,哈哈哈。。。。

#8楼   

2015-03-18 15:22 by  Jacy_liu   
学习了,谢谢楼主!!!

#9楼   

2015-08-02 19:52 by  木头和马尾   
有错误,c本身就表示地址,不能对c再取地址

#10楼   

2015-09-26 21:18 by  lookingfor   
@木头和马尾
你没有试过怎么知道不可以呢。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值