c语言 指针概念问题

int * p;
关于这句话的解释:
C Primer Plus 6th:p是一个指针,*p是int类型
郝斌C教程:p是变量的名字,int * 表示p变量存放的是int类型变量的地址
谭浩强:指针变量前面的"*"表示该变量的类型为指针型变量。指针变量名是p,而不是*p。

我的问题是,这句话 到底应该将int * 看作一个整体,还是将*p看作一个整体?
C Primer Plus似乎是将*p看作一个整体
郝斌和谭浩强似乎都是讲int*看作一个整体(郝斌的教程用书就是谭c),视频也多次强调p是int*类型的。

如果将int *看作一个整体,那么int * p,q;的含义实际是声明一个指针变量p和整形变量q。(这可能和赋值表达式语句的结合律是从右往左有关系。)
如果将*p看作是一个整体,那么取地址的时候应写成p = &i; 而不是*p = &i;(这也是谭c的解释)

到底如何理解 这行语句?能否从更底层来解释这句话?比如汇编或计算机原理这种层面。
这个问题有点牛角尖,希望可以得到想要的答案,
谢谢

我把我的理解跟你说下吧。

int *p;  //在定义(或者声明)指针变量时,变量p前面的“*”只是用来说明变量p是个指针变量而不是一个整型变量,int是指这个指针变量指向的是int类型的内存地址,指针本质上就是地址,任何类型的指针变量在内存中都是占用4个字节的存储空间的(即32位二进制数),既然指针变量存放的地址值都是32位的,那为什么还要区分类型呢?这是为了方便指针变量的运算。举例说明,

int *pn; //定义了一个指向整型的指针变量
char *str; //定义了一个指向字符型的指针变量
//假设,pn和str的初始值都是0x1000
pn++; //pn自增加1,pn的值为0x1004,因为int类型是占4个字节的,指向了下一个int类型的内存首地址
str++; //str自增加1,str的值为0x1001,因为char类型是占1个字节的,指向了下一个char类型的内存首地址

那么,从上面的例子,我们就可以知道,指针变量前面加上类型,是为了方便指向该类型的变量的内存空间,那么就可以通过该类型的指针变量来访问它所指向的内存空间的数据。

int*类型的含义是:变量p是指针变量名,而不是*p这个整体,*在定义指针变量的时候只是起说明的作用,int*不是一个整体,这点你要记住,说p是int*型指针,是为了方便而简写的形式,这里的*只起一个标记说明的作用而已,每定义一个int类型的指针变量,前面都要加*。

int *p,*q;  //定义了两个指向整型变量的指针变量

int *p,q;  //p是指针变量,而q是普通的变量

希望对你理解有所帮助吧。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-01-16
没有那么复杂,从汇编或者计算机原理层面,反而更用不到类型,那里只有地址和偏移。
定义变量,无法是两个要素,类型和变量名,类型让编译器知道可以做哪些运算和如何计算;
变量名让编译器做成一个名字和地址的对应,以便把后面作用域内所有的p,都翻译成这个地址。
所以,没有那么纠结了,类型是int *,变量名是p,*p是表达式,并且是一个左值表达式,就是说可以被赋值,你可以写*p = xxx;这样的语句,这样*p就有了整体看待成一个int的基础。本回答被提问者采纳