0
点赞
收藏
分享

微信扫一扫

指针进阶——(1)

爱做梦的老巫婆 2022-03-18 阅读 73

指针是什么?

1.指针就是个变量,用来存放地址,地址唯一标识一块内存空间。

2.指针的大小是固定的4/8个字节(32位平台/64位平台)。

3.指针是有类型,指针的类型决定了指针的+-整数的步长,指针解引用操作的时候的权限。

4.指针的运算。

就如同我们住的宾馆有房间号一样,其实,在计算机中。计算机存储是有编号的。

那对于这个编号,我们一般成为指针。

即:内存编号 = 地址 =指针

指针或者地址,其实它也可以被存储

那么它就被存储到指针变量中

①指针数组 - 存放指针的数组

②数组指针 - 指向数组的指针

一、指针数组

其实指针数组,就是存放只指针的数组
比如代码:
int (*arr)[10];
其实就是表示创建一个数组,数组的元素为指针。一共有10个
用图解释下:

例如下面代码:

int main()
{
	int a = 10;
	int b = 20;
	int c = 30;

	int* pa = &a;
	int* pb = &b;
	int* pc = &c;

	int* arr[3] = { &a,&b,&c };

	return 0;
}

 运行程序,可以观察到我们把a b c的地址保存在数组arr中,arr中存储的就是对应地址的值

将arr3中存储的地址改为指向他们的指针运行程序,会发现一样也可以找到a b c对应的值:

 类似于arr这个数组,如果保存指针的话,可以访问到指针指向的变量

像这样的数组,就称之为指针数组。数组内部保存的是指针。

那数组指针有什么用法呢?

int arr1[5]={1,2,3,4,5};
int arr2[5]={2,3,4,5,6};
int arr3[5]={3,4,5,6,7};

类似于这样的三个数组,如果我们想遍历打印他们的内容。

就可以将他们的数组首元素地址保存在一个指针数组之中。如下:

int main()
{
	int arr1[5] = { 1,2,3,4,5 };
	int arr2[5] = { 2,3,4,5,6 };
	int arr3[5] = { 3,4,5,6,7 };
	
	int* parr[3] = { arr1, arr2, arr3 };
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 5; j++)
		{
			printf("%d ", *(parr[i]+j));
		}
		printf("\n");
	}

	return 0;
}

 运行程序,得到如下结果

其中,*(parr[i])+j  代表的就是将parr中的第i个数组的地址解引用,然后找里面的第j个元素

二、数组指针

就如同

字符指针 - 指向字符的指针,存放的是字符变量的地址

整型指针 - 指向整型的指针, 存放整型变量地址的

数组指针 - 指向数组的指针,存放数组的地址

指针的作用不就是找到对应变量的地址,然后对其进行操作么,统一,数组指针也是指向数组的指针,通过它就可以访问到数组。

例如写一个函数打印数组的内容,代码如下:

 

//形参写成数组的形式
void print1(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}


//形参写成指针的形式
void print2(int* arr, int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(arr + i));
	}
	printf("\n");
}

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	//写一个函数打印arr数组的内容
	int sz = sizeof(arr) / sizeof(arr[0]);
	printf("数组打印形式:\n");
	print1(arr, sz);
	printf("指针打印形式:\n");
	print2(arr, sz);

	return 0;
}

可以看到他们打印出的结果都是一样的

但是,我前面的文章说过,当用数组作为形参传递时,在内存中真的会开辟出来一片内存来给程序使用。这样很容易造成内存空间的浪费

采用只指针的方式进行访问,可以节省很多内存空间。

举报

相关推荐

0 条评论