黑马程序员技术交流社区

标题: 现在看视频有些懵了,关于(*p)的问题,请帮我解释一下 [打印本页]

作者: 兰闻天    时间: 2014-4-28 15:07
标题: 现在看视频有些懵了,关于(*p)的问题,请帮我解释一下
(*p)老师说了是固定写法,代表指针变量p将来肯定是指向函数的;
那下面的怎么解释啊?
#include <stdio.h>
int main()
{
        struct Nums
        {
                int sum;
                int minus;
        }
        struct Nums count = {12,4};
        struct Mums *p =&count;
        printf("sum=%d,minus=%d\n",(*p).sum,(*p).minus);
        return 0;
}
麻烦详细一些,现在很糊涂,谢谢
作者: gaoxinglei123    时间: 2014-4-28 15:18
没有(*p)是固定写法这种说法。这儿还是按优先级的顺序算的。。
楼主是定义了一个Nums类型的指针p指向了Nums类型的变量count。即p里面储存了count的地址
*p的值就是count。printf("sum=%d,minus=%d\n",(*p).sum,(*p).minus);因为.的优先级是比*高的。
所以这儿加个括号。先算*p再算.    (*p).sum就是count.sum

作者: 兰闻天    时间: 2014-4-28 15:23
gaoxinglei123 发表于 2014-4-28 15:18
没有(*p)是固定写法这种说法。这儿还是按优先级的顺序算的。。
楼主是定义了一个Nums类型的指针p指向了Nums ...

哦,谢谢!!可是,(*p)是固定写法这个是老师在指向函数的指针里讲的啊。
作者: 李鹏-ios    时间: 2014-4-28 15:25
指针是C语言中广泛使用的一种数据类型,利用指针变量可以表示各种数据结构; 能很方便地使用数组和字符串,结构体等数据类型,当然也可以指向函数,不过要指向函数的话,应该类似这样定义吧,如int (*p)(参数1,参数2,...);  //fp是函数指针;而你上面举得例子指针指向的是结构体这种数据类型的,而不是函数。
作者: 兰闻天    时间: 2014-4-28 15:29
李鹏-ios 发表于 2014-4-28 15:25
指针是C语言中广泛使用的一种数据类型,利用指针变量可以表示各种数据结构; 能很方便地使用数组和字符串, ...

意思是只有指向函数(*p)才是固定写法吗?
作者: 李鹏-ios    时间: 2014-4-28 15:42
兰闻天 发表于 2014-4-28 15:29
意思是只有指向函数(*p)才是固定写法吗?

函数指针的声明int (*p)(参数1,参数2,...); 就是这种固定格式,与其他数据类型的指针定义是不同的;而你的例子中使用(*p).sum来访问结构体的,(* p)表示 p 指向的结构体变量,(*p).sum 是 p 指向的结构体变量中的成员 sum 。注意 * p两侧的括号不可省略,因为成员运算符 “ . ” 优先于“ * ”运算符,* p.sum 就等价于*(p.sum)了。这样你应该清楚了吧?
作者: 兰闻天    时间: 2014-4-28 15:47
李鹏-ios 发表于 2014-4-28 15:42
函数指针的声明int (*p)(参数1,参数2,...); 就是这种固定格式,与其他数据类型的指针定义是不同的;而你 ...

哦,明白了,谢谢
作者: NenKeer    时间: 2014-4-28 21:30
(*p)是定义指向函数的指针时的固定写法,这个没有问题。
结构体(*p).sum 加括号是为了改变运算符的优先级,因为如果不加小括号的话 点运算符的优先级要高于*运算符。

  1. *p.sum      //结构体的情况下 不加括号 相当于*(p.sum)
  2. (*p).sum             //用括号将*的优先级提高
复制代码

作者: hhmm665544    时间: 2014-4-28 23:07
*p不就是指针么?p就是内存地址,*p就是那个内存地址的值,根据指针类型的不同,*p可以是基本数据类型,也可以是指向函数或者数组的首地址
作者: hhmm665544    时间: 2014-4-28 23:12
在windows32系统中,每个程序运行的时候,系统就会为他开辟一个大小为4G的空间,一般程序领空是0x40000000开始的,也就是你的代码块存放在这里,其他的变量或者系统的dll文件就由系统随机分配空间的,用new关键字开辟空间也是一样随机分配的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2