将一个字符数组进行遍历:
while(*src !='\0')
{
src++;
}
这里的数组名用法和指针的用法基本差不多,但是它们还是有区别的。比如数组名不能成为赋值符号的左值,
姑且认为它只是一个指针的常量吧!(有人写过一些证明,说数组名在内存空间没有空间,认为这是一个符号。)
数组名代表的是这个数组的首元素的地址(任何元素,包括一维数组),数组取地址以后就是这个数组的地址(二维
数组名取地址,就是二维数组的地址)。说的有点抽象
举一个例子:
先简单点就一个一维数组:
int a[2];
当你分别输出地址:a,&a,你会发现两个值是一样的;
但是两个步长不一样,因为含义就不一样;
a的步长是四个字节,因为它代表的是一个整型的地址;
&a的步长是8个字节,因为它代表的一个有两个整型的数组的地址;
注:什么是步长,俗话就是一步有多长。看前面的while里面的加1,因为是字符串所以每次加1,就是加1;
如果是整型的数组的话,加1,每次地址其实加4。
int a[3][3][3];
&a:是指这个三维数组的地址;
a:指的是这个三维数组里面第一个二维数组的地址
*a:是指三维数组的第一个二维数组的的首个一维数组的地址;
**a::是指三维数组的第一个二维数组的的首个一维数组的首个元素的地址;
这些地址值都一样,但是步长不一样;
//***a:是指三维数组的第一个二维数组的的首个一维数组的首个元素的值;
*(*(*(a+i)+j)+k) 代表的含义是 a[i][j][k];可以展开读一下;
指针变量取地址的后,是指指针变量所分配的空间的地址;
数组和指针的区别:
1.空间的分配:
数组是静态分配,分配局部的话,分配在栈空间里面,最后会自动的释放,而,指针的空间
需要自己手动的分配,到最后的时候还需要手动的释放
2.访问的效率:数组的访问更加快,因为指针相当节间的访问,访问的效率比较低。
3.安全性:数组容易出现越界的情况,指针容易造成内存的泄漏。
4.函数的形参,数组:数组的指针,指针的:指针的指针。
注:指针偏向于地址的处理,数组更偏向于数值的处理;
数组的分配的空间是连续的
指针分配的空间是不连续的,但是连接起来的。(空间的地址不是连续的)