基础知识:
数组名:相当于指针,即数组作为实际参数时,不是传值给形式参数,而是把实际参数数组的起始地址传递给形式参数数组,这样两个数组就共用一段内存,不需要建立两个 即浪费空间。
指针 :int *pointer = a; *pointer 表示变量a本身,pointer表示变量a在内存的地址。
程序:
int a,b;
int *p1,*p2;
scanf("%d,%d",&a,&b);//格式化输入a,b的值
p1 = &a;//&为地址运算符
p2 = &b;//把指针变量(p1,p2)的值 指向变量(a,b)的地址。
printf("%d,%d",*p1,*p2);
PS:
temp_p = p1;//地址内存
temp = *p1;//实际上的值
多维数组:(首先,把多维数组当作多个一维数组)(表面上与一维有冲突)
例如:static int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};//定义一个3行4列的二维数组
数组中a+0表示第0行的首地址;数组中a+1表示第1行的首地址;*a表示*a(a+0);第一个元素其实就是a[0][0]
*(a+0)显然表示的不是物理位置,也就不可能得到第一个元素的值了,他仅仅是一个内存地址,也就是第0行的起始地址。
*(*(a+0)+0)表示第0行第0列个元素的值,就是a[0][0];
总结:
1,a与*a表示这个数组的地址;
2,a[0]与*(a+0)表示这个数组的0行首地址
3,&a[0],&a[0][0]分别表示0行的首地址,0行0列的元素的地址。值或是地址 作取地址运算都是地址。
4,a[0][0]与*(*(a+0)+0)表示第一个元素。
5,a[1]与(a+1)表示1行的首地址。
6,*(*(a+0)+0)与*((a+0)+0)不同。
对于2维数组而言,a[0]表示地址。
对于数组,a[0][0],表示的意思为a[0]表示地址,[0]表示第一位,和在一起表示值。
而对于a[0],a表示地址,[0]表示位,和在一起表示值。
"*"操作,必须精确到元素的时候,才能得到他得值,否则为地址值。是物理地址不是“内存地址”。
把2维数组作为一维看得时候,*(a[1])=5是正确的,类似于b[2]={33,4};,*b=33;即对于一维数组,*b默认表示第一个值。
因为*(a[1]) = *(*(a+1)+0);所以a[1]=*(a+1)+0
b+1表示将b数组的起始位置向后进一位,移动到第二个元素的地址上,也就是b[0]到b[1]的过程。
数组名称代表的是数组的第一个元素的内存地址,与指针相似!