c语言 指针概念问题

2024-11-28 20:45:07
推荐回答(2个)
回答1:

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

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是普通的变量

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

回答2:

没有那么复杂,从汇编或者计算机原理层面,反而更用不到类型,那里只有地址和偏移。
定义变量,无法是两个要素,类型和变量名,类型让编译器知道可以做哪些运算和如何计算;
变量名让编译器做成一个名字和地址的对应,以便把后面作用域内所有的p,都翻译成这个地址。
所以,岩猜斗没有那么纠结了,类型是int *,变量名是p,*p是表达式,并且是一个左值表达式,就是说可以被赋值,你可以写*p = xxx;这样的粗磨语句,这样*p就有了整体兆局看待成一个int的基础。