C语言中关于指针的问题
请问:【多维数组最后一维的元素是数组中保存的数据,剩下的各维和多维数组名都是指针。】这句话该怎么理解!能举例说明吗? 展开
提问者的理解稍微有一点误区。指针了类型是4个字节(32位),没错,当然这和系统有关,暂不讨论这个问题。int类型我们也按照4个字节来看待。
图中p是一个指针类型的变量,a是一个整型的变量,他们所占的空间都是4个字节,是方框表示的大小。但是提问者的误区在这里,指针变量里面存放的是什么?虽然它是一个指向int变量的指针,但它存放的不是int变量,而是整形变量的地址0008!(记住指针变量存放的是变量的地址,而不是变量本身,所以指针变量p的空间大小和指针变量指向的内容a的空间大小没关系,和你所使用的系统的地址空间有关)
这样就有出现了一个问题,我也不知道指针变量要给多大才够啊,四个字节够吗?怎么判断指针类型的大小够不够呢?这和系统相关,语言设定的指针变量的空间的位数要能够足够表示内存地址的个数。
举个例子,假设你的内存是512字节的,就是512的地址需要区分(小了点,解释方便)。那么也就是说你的内存是从0到511(0000 0000 - 1111 1111)(以下说明为了简单,不考虑复杂的寻址方式,也不区分片内地址,看不懂可以略过,主要是怕有人产生疑惑,假设寻址的时候地址和物理地址是一一对应的关系)。如果你说指针变量为1位,那么你觉得可以吗?1为只有0和1两种状态,只能表示两个地址其他510个呢,怎么能表示512个地址呢!4位,很显然只能表示16个地址(0-15)。
因此,你提问中的指针变量为什么要用32位,这和一个字节是8位没有关系,要看你内存的地址空间有多大,最少指针变量的空间要能够表示整个地址空间。假如未来内存变得很大很大,现在的32也不一定够用。
上面举得那个512字节的地址的例子,可能有人会自己去算去,我的内存是1G,2G,4G,那么我的指针变量为什么也是四个字节呢?我只能说一定是够的,只不过像我刚才声明的那样,计算机的实际的寻址方式并不是我们想象的那么简单,并不是单纯的一对一的关系,涉及到片选和片内地址的为问题,二者是不同的,如果想学习的话,可以看下计算机组成原理方面的书籍。
定义数组int a[10]
则a[1],a[2]这些就表示对应数据(变量)
但是,直接写a就表示数组的头指针(地址)
也就是a=&a[0]
同样类比到二维
定义数组int a[10][10]
则a[1][1],a[2][1]就表示变量
但如果用一维表示则为指针
即a[1]=&a[1][0],a[2]=&a[2][0]
用数组名则表示整个数组的头指针
即a=&a[0][0]
同理可以类比到更多维度。
纯手打,望采纳,谢谢。
移动指针的时候。。。。。。。。。。。。。指的是:指针所指的类型所占的长度啊。
你可以用sizeof()看一下
所占内存大小。
比如
char
*p;
int
*s;
那么:
sizeof(p)=4,sizeof(*p)=1
sizeof(s)=4,sizeof(*s)=4
注意,结果依据编译器而定。TC一般是2字节。。VC++是4字节。