以物理方式秒懂c语言指针
电脑有三种总线:数据总线Data(D),地址总线Adress(A),控制总线Contrl(C)读取内存里的一个数据,先向地址总线传输地址,接着通过控制总线控制读或写,最后通过数据总线传输数据
所以
(重点: 可以把任何变量看做是一组常常的地址总线,指针也不例外)
举例:
c语言的一个变量B,可以理解为 Adress (地址总线)
int a; 可以看成 int Adress(地址总线);
根据c语言指针的定义:
类型 * name; 如 int* ptrname; ptrname就是指向 int 类型的指针
换成上面的符号
就是 int* Adress(地址总线);就是指向这个地址Adress.(根据反汇编可知 * 没啥意义,只是写给编译器看的)
实战:
char *p[]={ "aaa","bbb","ccc"};//暗含 Adress:p[0],p[1],[2],Data:"aaa","bbb","ccc"
char **cp[]={p+2,p+1,p};// 暗含 Adress : cp[0],cp[1],cp[2], p+2,p+1,p
char ***cpp=cp; // 非Data的都是Adress,它们就如拉电线那样互相缠绕
printf("%s",**++cpp);//答案????
printf("%s",(*(cpp[(-1)]))+1);//答案???
(附:C语言的复杂类型解释(别人的):变量遇到类型就说 什么类型的变量;如 int a; a是int类型的变量
遇到*号 就说 是指向。。。。的指针
遇到[] 就说是。。。。。的数组
遇到() 就说是返回。。。。的函数
举列子:
int (**p[])();怎么读:
第一步 p遇到 [] 先说 p 是。。。。。的数组
第二步 p遇到* -----p 是指向。。。。的指针的数组
第三步 再遇到* 就说 p 是指向。。。的指针的指针的数组
略)
[此贴子已经被作者于2021-7-17 00:27编辑过]