怪胎 发表于 2012-9-1 18:56:18

关于指针的一大堆问题

1.
int i;               整形变量
int *p;            指针变量
int a;         数组
int *p;       指针数组
int (*p);   (请问是不是数组指针)
int f()            函数
int *p()         指针函数
int (*p)()       函数指针
int **p          指向指针的指针
2.请问int *p;和int (*p);有什么区别 最好是举例(程序)说明!
是不是说*p不能改变 而 (*p)可以加1=p+1二维数组 最好是拿程序说明
3.请问int *p()和int (*p)()有什么区别 最好是举例(程序)说明!
4.**p 什么意思 这样理解对不对?**p和*p有什么区别?
#include <stdio.h>
void main()
{
      char *name[] = {"Fishc.com", "www.fishc.com", "home.fishc.com", "Fishc.com/dz"};
      char **p;    //定义一个指向指针的指针
      int i;
      for( i=0; i < 4; i++ )
      {
            p = name + i;   //把name+i的地址存放在p里面
            printf("%s\n", *p);   //取p里面的地址的值
      }
}
                            谢谢

梦幻羽羽 发表于 2012-9-1 18:56:19

呵呵楼主,对于全面的指针深入解析,我认为一时间是说不清楚的,毕竟c的精华,岂是三言二语?呵呵下面的个人解说希望能帮助你, 如有错误,在此道歉。

首先,问题一: int *p;和int (*p)

分析:你看第一个int *p   你在看看这个int p;   这两个有共同之处,   就是p为数组。有n的元素 。   而不同之处 在于,   int *p是表示 p为数组,含n个元素, 每个元素为int指针(强调哦,每个都为int型的指针),int p 是表示 p为数组,含n个元素, 每个元素为int类型。那么我们看看这 int(*p)
p为指针,指向的由n个int类型变量数构成的数组.也就是说他们最大的区别在于一个是数组的类型。 而另一个是指向一个数组 (对于举例,犹豫篇幅的问题,所以我只能列出很简单的在此表示歉意)
比如:
         int a = {0,1,2};    //定义一个 整形数组a有三个元素 分别是 a,a,a
         int *p1={%a, %b, %c}//假设 前面定义了 3个 变量 a b c呵呵,抱歉   没能写详细
         int (*p)=%a       // 这里是取 int p的地址,看清楚是int a哦而不是 int *p1 想一想为什么?

问题二:int *p()和int (*p)()

分析 :int *p() 指针函数   无参数,强调指针, 不是普通函数与 int p()不同 (int *p( int x )这样就是有参数了~)
而 int (*p)()是一个int类型的无参数的函数指针,它指向的是一个函数
其实就是   一个是函数 (指针函数)   一个是变量 (指向函数的变量。指针)
比如:
         int *p                     //定义一个 指针(指向函数的指针    也就是函数指针)
         int a(int x);       //定义一个 p 函数
         p = a                     //好好想想为什么不用加 &      如果想不到请联系我   我的个人资料有我qq
         int *p(int x);      //定义了   一个指针函数   带形参int型
      
问题四: **p 什么意思这样理解对不对?**p和*p有什么区别?

分析:指向指针的指针,是真确的呵呵书本上的把,呵呵 下面我以我的解释来说, 希望你能明白

呵呵, 这是我的比喻~

       一把箭上有二个相同的爱心,   分别是 爱心1, 爱心2 (爱心1   体积大于爱心2切记~    这样是为了让你好分辨,不至于晕了~ ),   好, 现在你看,爱心1 与爱心2由于箭头是朝右的,那么这s时不正是爱心1 指向爱心2 吗 ?(顺序: 爱心1 爱心2) ,   刚好   爱心1比爱心2体积大而且能包容 爱心2   现在你想想**p 与 *P      他们的区别   一个是包容 *p类型的 (也就是说**p这种类型是 包容指针类型的如果你 **p = %a (比如 a 整形) 那么就错误了,因为类型不是一个层次的)    ,而另一个是指向 普通类型的变量

问题五: 我想楼主是想问 为什么能   p = name + i把?

我的提示:   呵呵楼主好好看完我上面的解答, 我相信你能明白, 因为上面看懂了,这也就自然而然就懂了      当然还有问题联系我qq

呵呵 ,   楼主问题总算完了,虽然我不能说的很生动,很详细      但是希望你能看会,如果有误的地方请多多包涵,毕竟我是人么。不是神,难免一出 ,   希望楼主多多实验。

好 了       楼主加油~    886 ~

呵呵

梦幻羽羽 发表于 2012-9-1 21:42:09

呵呵   我回顾一看,我把问题三打成打问题四了,问题四打成打问题五了   呵呵,不好意思,我还真是错误多多

楚门 发表于 2012-9-1 23:11:03

告诉你分析的方法吧!从变量出发,由内向外,例如分析:int (*p);(*p)表明p是一个指针,这个指针指向什么呢,再向外分析,可以看到它指向一个int型的数组,这个数组存放了n个整型变量,所以p就是一个指向有n个整型变量的数组,再分析:int *p;由于[ ]的优先级高于*,所以p先与结合,表明p是一个数组,这个数组存放的是什么呢?向外分析我们可以发现,这个数组存放的是int型的指针,所以p就是一个数组,这个数组存放n个int型指针,关于这些复杂变量的类型分析基本上都是这个思路,跟你推荐一个csdn的博客:http://blog.csdn.net/megaboy/article/category/147505

怪胎 发表于 2012-9-3 17:53:16

梦幻羽羽 发表于 2012-9-1 21:39 static/image/common/back.gif
呵呵楼主,对于全面的指针深入解析,我认为一时间是说不清楚的,毕竟c的精华,岂是三言二语?呵呵下面 ...

谢谢你 有点懂了 继续思考..

lsh華 发表于 2013-5-23 22:48:15

楼主加油,鱼C加油!我们都看好你哦!

桑黄 发表于 2013-5-24 10:53:38

这篇文章分析得十分透彻易懂,我时不时都回去看看
[知识分享] 深入理解C语言指针的奥秘
http://bbs.fishc.com/forum.php?mod=viewthread&tid=5218

坑谁呢! 发表于 2014-1-7 20:40:43

为什么http://home.fishc.com/这个网站打不开?
页: [1]
查看完整版本: 关于指针的一大堆问题