二维数组名含义:
二维数组名a是二维数组的首地址,也就是数组地址:&a[0];&a[0][0]是0行0列首地址,也是数组首地址;
a[0]是第0行数组的首地址,即&a[0][0];
行数组名a[i]表示第 i 行首元素地址即为: &a[i][0]
&a[i][j] ==> a[i] + j 或 *(a + i) + j 或 &a[i][0] + j
a[i][j] ==> *(a[i]+j) 或 *(*(a+i)+j)
使用指针变量访问二维数组:
定义基类型为数组元素的指针:
int *p ;(用于存放 &a[i][j])
初始化必须是二维数组元素地址,即:
p =&a[0][0] 或 p = a[0]
用p++,或 *p+(3*i)+j)访问数组元素,将二位数组当一维数组访问
例子:(用指针变量输出数组元素的值)
#include <stdio.h>
int main()
{
int a[3][3] = { {2,3,1},{4,3,2},{6,4,3} };
int *p;
for (p = a[0]; p < &a[0][0] + 9; p++)
printf("%d ", *p);
return 0;
}
指针与基本变量作为函数参数时的区别:
1.使用基本变量进行“交换变量的值”
#include <stdio.h>
void exchange(int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
int main()
{
int a, b;
printf("输入两个整数:\n");
scanf("%d%d",&a,&b);
printf("交换前的数字为:%d %d\n",a,b);
exchange(a, b);
printf("交换后的数字为:%d %d\n",a,b);
printf("\n");
return 0;
}
阅读上面的程序,思考一下他们的值能否进行交换?
可以看出使用基本变量作为参数是不能实现“交换变量值的”
解析如下:
#include <stdio.h>
void exchange(int a, int b)
{
int temp;
temp = a;
a = b; //把b的值赋值给a
b = temp; //把a的值赋值给b
}
//函数结束时,exchange()函数出栈,销毁里面的数据,换句话说以上操作等于白做!
//并没有在本质上(地址上)改变他们的值
int main()
{
int a, b;
printf("输入两个整数:\n");
scanf("%d%d",&a,&b);
printf("交换前的数字为:%d %d\n",a,b);
exchange(a, b); //程序进栈,传入a,b的值
printf("交换后的数字为:%d %d\n",a,b);
printf("\n");
return 0;
}
1.使用指针变量进行“交换变量的值”
#include <stdio.h>
void exchange(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int a;
int b;
printf("输入两个整数:\n");
scanf("%d%d", &a, &b);
printf("交换前的数字为:%d %d\n", a, b);
exchange(&a, &b); //传入a,b的地址
printf("交换后的数字为:%d %d\n", a, b);
printf("\n");
return 0;
}
总结:使用基本变量作为参数是不能实现“交换变量值的”,使用指针变量作为参数是可以实现“交换变量值的”
函数参数及传递规则
- 简单变量做参数,由实参到形参是单向值传递;
- 指针变量做参数,是地址传参;
- 数组做参数,是地址传参,其大小信息会丢失。
在函数定义和声明中,,指针变量和数组可以通用
int f(int *ar) 与 int f(int a[ ])。
当地址作为参数传递时。指针变量所指向的对象就可以间接的被修改。