留言与评论(共有 0 条评论) |
发布时间:2020-04-12 08:49:36
这个问题问错了,你把它们当成表达式来问了。
如果是表达式,那么方括号里应该有个数字,或变量,否则你没东西算。
那么就应该是声明了,你缺少了基类型。
一看就知道你是初学者,把指针声明里的星号,和普通算式里的间接访问运算搞混了。
假设你的基类型是整数,用int,那么int *p;这句话里int的意思,就是你指针里存的那个地址所对应的那个空间,是用来存整数的,不能存小数或字母等。
这个表达式是这么看的:int * p;
不要这么看:int *p;
int叫做基类型,int *叫做指向int型数据的指针类型——p里存的是个指针,也就是地址。
那么int **,就是以int *为基类型的指针类型。它是指向指针的指针——它作为一个地址,所连接的存储空间里,存的是指向int数据的地址。
所以int ** p〔〕;就是告诉计算机:给我一连串的空间,每个空间都是装地址的,而且这些地址是指向地址的,别给我搞成指向其他类型的了……
那么int * (*p)〔〕;想懂这句声明,你要先明白一个概念:数组的名字,是一个指针。也就是说,数组的名字,他天然就装着这个数组的地址(也就是它第一个元素的地址)。
比如int a〔〕;int * p;这两句话写出来了——那么,我可以直接用p=a;把a的值给p。
所以int * (*p)〔〕;这句话里,(*p)相当于一个数组名,也就是地址,而这里的*p,不是取p指向的值!而是在说:p是个指针!!!这个指针指向的指针,是这个数组的第一个元素的地址(也就是这个数组的指针)。
——再连上前面的int *——是说:有一连串的空间,每个空间里都装的都是地址,这些地址指向的是int型数据。而p,是指针,它指向另一个指针,这个指针没有名字,但是这个没名字的指针,是指向这个数组的——也就是与这个数组里的第一个元素的地址相等。
我知道你不懂,那就再举个简单的例子。
int a〔〕;int (*p)〔〕;这两句话出来了,我能不能用p=a;来给p赋a值?显然不能,因为a是个地址,p是个指向地址的地址,所以应该是p=&a;来把a的地址赋给p。
或者直接写成int (*p)〔〕=&a;——这句话很有迷惑性啊!!一不留神你就把等号左边当成个算式开始取值了——千万时刻注意!当一个数据类型和星号共同出现时,它们的目的只有一个:告诉计算机这是指针。至于是指向啥的指针,你自己仔细。
我知道说了这么多,可能你一个字都没看懂。
但没关系,这些都是纯玩儿概念的,没什么实用价值,属于“贵族的娱乐”~
留言与评论(共有 0 条评论) |
全站搜索