C++语言学习记录-16:指针与数组间的联系

指针运算

一般来讲,指针的算术运算是和数组的使用相联系的,只有在使用数组时,才会得到连续分布的可操作内存空间。下面介绍指针运算的基本原理。
指针是一种数据类型,与其他数据类型一样,指针变量也可以参与部分运算,包括算术运算、关系运算和赋值运算。
指针可以和整数进行加减运算,但是它所代表的含义比较特殊。比如说指针p,当加上一个整数n时,p+n指的是p当前所指的位置后方第n个地址。同理,p-n指前方第n个地址。p++指当前位置下一个数据的地址,p–指的是前一个数据的地址。
*(p1+n1)表示p1当前所指的数后n1个数的内容,也作p1[n1]。
指针变量的关系运算指的是指向相同数据类型的指针之间进行的关系运算,如果两个相同类型的指针相等,那就意味着他们指向的是同一个地址。不同类型的指针之间或指针与非零整数之间的关系运算是毫无意义的。
但是,指针变量可以与0比较,0专用与表示空指针。因此制作一个空指针也可以用如下语句:

int* p;
p = 0;

用指针处理数组元素

指针加减运算的特点使得指针适合于储存在一段连续内存空间中的同类数据。数组正好是这样的数据集合。下面使用指针变量输出以下数组的值。

#include<iostream>
using namespace std;
int main(){
    
    
	int a[10]={
    
    1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
	for(int * p=a; p< (a + 10); p++)
		cout<<*p<<"  ";
	cout<<endl;
	return 0;
}

运行这段程序后,就会将每一个元素的值显示。
*p并不是代表指针,而是代表指针所指向的值。指针通过数组名这个地址常量和简单的算术运算就可以访问数组元素,如数组中下标为i的元素就是数组名+i

*array即为array[0], *(array+3)即为array[3]

因此,可以利用指针的算术运算得出每个元素地址所指向的值。,并利用for循环将他们显示出来。
当然,数组名即为数组的首地址,所以用以下的方法可以输出数组的第一个元素。

int *p = arr;
cout<<*p<<endl;

指针数组

如果一个数组的每一个元素都是指针变量,这个数组就是指针数组。指针数组的每一个元素都必须是同一类型的指针。
声明一维指针数组需要用以下语法:

int * pa[3];

这样就产生了一个其中有三个元素的指针数组,每个元素都是一个指向int类型数据的指针。由于指针数组的每一个元素都是指针,所以必须先赋值后引用。下面一段程序是利用指针数组输出单位矩阵。

#include<iostream>
using namespace std;
int main(){
    
    
	int line1[]={
    
    1, 0, 0};		//定义矩阵第一行的数组
	int line2[]={
    
    0, 1, 0};		//定义第二行
	int line3[]={
    
    0, 0, 1};
	int * pLine[3]={
    
    line1, line2, line3}; //定义int数组并初始化
	cout<<"Matrix Test: "<<endl;
	for(int i =0 ; i < 3; i++){
    
    
		for(int j = 0; j < 3; j++){
    
    
			cout<<pLine[i][j]<<" ";
		cout<<endl;
	}
	return 0;
}

指针数组中的每一个元素都指向矩阵中的一行,每一行都用一个数组进行存放,然后通过指针数组的元素访问存放数据的int型数组。pLine[i][j]与*(pLine[i]+j)等价,指访问指向第i个指针后的第j个数据。

猜你喜欢

转载自blog.csdn.net/leanneTN/article/details/109146713