首先,我们知道数组与指针是不一样的。从左值开始讲起。x=y。x在编译中就是一地址,y则是赋予这地址的内容。x是可知的,y是不可知的,y在运行时才会知道。
访问数组:
int a[100]:首先访问的是a的地址,也就是所谓的数组的起始地址,然后在起始地址加上i的值,获取地址,再取得地址中的内容。
访问指针:
int *a:首先访问a的地址,a地址的内容是另一个地址,通过访问另一个地址找到我们所需要的内容。所以访问指针比访问数组多了一层额外的提取。
所以数组和指针是很不一样的,一个是地址,一个是地址的地址。他们为什么会被混淆?是因为他们有一样的地方。
在函数形参中,数组和指针则表现的相当一致,char *argv和char argv[]是不是一样呢?其实不是一样的,只是在main函数中做形参时,argv[]被编译器默认为数组的第一个元素地址,*argv则在传值参数中,被当成指针所指向变量的值,而非变量本身,所以*argv也是一个首地址。
另外,编译器会在计算地址时自动加上不同类型的步长。所以a[i]和啊[i+1]其实距离不是1,而是4.
多维数组,并不是像矩阵那样的多维,多维数组在内存中也是线性结构。p[i][j]:如果是以一条长为n的轴来说,p[i]在i/n的点处,p[i][j]在该点的第j点处
请多指教。