指针学习(4)----指针和一、二维数组

前面介绍数组的时候我们采用的引用方法是通过数组的下标,其实比较常用的方法是通过指针来引用数组。

首先我们得知道数组在内存中的存储方式。

不管是一维数组还是二维数组,数组中的元素被连续存储在连续的内存中,每一个内存都有自己的地址,指针变量可以存放地址,通过将数组的地址赋值给指针变量,就可以引用数组。

首先来通过一个实例来进行了解指针引用数组。

#include <iostream>
using namespace std;

void main()
{
	int i, a[10];
	int* p;
	for (i = 0; i < 10; i++)
		a[i] = i;
	p = &a[0];
	//p = a;  //这句代码的功能和p=&a[0]一样
	for (i = 0; i < 10; i++, p++)
		cout << *p << endl;
}

第一步就需要我们先声明一个数组,再声明一个指针。指针变量p指向数组中的其中一个元素,p+1代表指向该数组中的下一个元素。上面代码中注释的 p = a 这句中,a代表的数组首元素的地址。p+i和a+i代表的都是a[i]的地址,所指向的数组元素都是a[i]。简单总结一下上面的话就是:使用指针可以获取数组首元素的地址或者直接将数组名赋给指针,之后再进行指针访问数组。

对于二维数组来说,其内存地址也是连续的,可以将二维数组看作是一维数组。来看例子:

#include<iostream>
using namespace std;
void main()
{
	int a[4][3] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
	int* p;
	p = a[0];
	cout << "数组a的长度为:" << sizeof(a) << endl;
	cout << "int的长度为:" << sizeof(int) << endl;
	for (int i = 0; i < (sizeof(a) / sizeof(int)); i++)
	{
		cout << "address:";
		cout << a[i];
		cout << "is:";
		cout << *p++ << endl;
	}
}

对于二维数组来说,函数名a代表的就是二维数组的地址,a就是一个指向数组的指针。对于二维数组中的地址(1、2、3)以及元素(4、5)表示方式有几种需要记住的。

(1)最简单的就是取地址符号:&a[m][n],表示的就是第m行第n列的元素的地址;

(2)因为a就是一个指向数组的指针,a+n表示的就是第n行元素的首地址;

(3)&a[n]表示的是第n行的首地址,那么第(2)和第(3)可以得出:&a[n]=a+n ;

(4)*(a[n]+m)表示的是第n行第m列的元素;

(5)*(*(a+n)+m)表示的也是第n行第m列的元素。

a[n]表示的是第n行的一维数组,那么从(3)可以知道a[n]=*(a+n),所以4、5表示的是一个意思的,你们应该明白的吧!

再来一个实例,透彻了解一下。

#include<iostream>
using namespace std;

void main()
{
	int a[3][4];
	int(*b)[4];//这是一个数组指针,可以指向一个含有4个整型变量的数组
	int* c[4]; //这是一个指针数组,存储指针的数组,最多可以存储4个指针
	int* p;
	p = a[0];  //其实这句话也可以写作:p=*a;
	b = a;
	cout << "初始化数组" << endl;
	for (int i = 0; i < 12; i++)
	{
		*(p + i) = i + 1;
		cout << a[i / 4][i % 4] << ",";
		if ((i + 1) % 4 == 0)
		{
			cout << endl;
		}
	}
	cout << "使用数组指针来改变数组的值" << endl;
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			*(*(b + i) + j) += 10;
		}
	}

	cout << "使用指针数组" << endl;
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			c[j] = &a[i][j];
			cout << *(c[j]) << ",";
			if ((j + 1) % 4 == 0)
			{
				cout << endl;
			}
		}
	}
}

a指的是数组a的0行的行地址,我们知道数组a就是一个指针,a+n表示的是第n行的首地址,就是a[n]的地址&a[n],而a[n]也是一个指针,表示的第n行的首元素地址,也就是说a+n指向指针a[n]的地址,也由此可以得出,p=*a与p=a[0]是相同的效果,这里的n=0。

再看数组指针,(*b)[4],这是一个指向数组的指针,指向一个含有4个整型变量的数组,b=a使得指针b指向数组a,那么为什么a可以直接赋给b呢?a不是指针吗?前面的p=a为什么是非法操作呢?在这里b作为一个数组指针,指向的是行地址,a表示的也是第0行的行地址,因此可以直接进行b=a的操作,而p就是一个普通指针,指向的是单独的一个地址,因此不可以进行p=a的操作。

至于指针数组,*c[4],这是存储指针的数组,四个指针分别对数组的四列进行显示,这个应该比较容易理解的。

总之,指针这部分呢,你得品,得细品,特别适合数组结合起来的时候,如有不正之处,希望各位大神不吝指教!谢谢!

 

 

 

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值