指针与二维数组

二维数组名含义:

      二维数组名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;
}

总结:使用基本变量作为参数是不能实现“交换变量值的”,使用指针变量作为参数是可以实现“交换变量值的”

函数参数及传递规则

  1. 简单变量做参数,由实参到形参是单向值传递;
  2. 指针变量做参数,是地址传参;
  3. 数组做参数,是地址传参,其大小信息会丢失。

在函数定义和声明中,,指针变量和数组可以通用

      int f(int *ar) 与 int f(int a[ ])。

当地址作为参数传递时。指针变量所指向的对象就可以间接的被修改。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值