指针的理解系列--2

目录

二、数组

1、数组名的理解

1.1、【 数组名就是数组首元素(第一个元素)的地址 】

1.2、唯一的例外:

2、使用指针访问数组

1.1 、使用下标访问数组

1.2、使用指针访问数组

3、一维数组传参

3.1、冒泡排序

4、二级指针

5、指针数组

5.1、指针数组模拟二维数组


二、数组

1、数组名的理解

1.1、【 数组名就是数组首元素(第一个元素)的地址 】
#include<stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("&arr[0] = %p\n", &arr[0]); // &arr[0] = 00000052A2D6FAD8
	printf("   arr  = %p\n", arr);     //    arr  = 00000052A2D6FAD8
	return 0;
}
1.2、唯一的例外:

sizeof(数组名):sizeof中单独存放数组名,这里的数组名表示整个数组,计算的是整个数组的大小

&数组名:这里的数组名表示整个数组,取出的是整个数组的地址

【其他时候,任何地方使用数组名,数组名都表示首元素的地址】

2、使用指针访问数组

1.1 、使用下标访问数组
#include<stdio.h>
int main()
{
	int arr[10] = { 0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		scanf("%d", &arr[i]);   //1 2 3 4 5 6 7 8 9 10   
	}
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);  //1 2 3 4 5 6 7 8 9 10
	}
	return 0;
}
1.2、使用指针访问数组
#include<stdio.h>
int main()
{
	int arr[10] = { 0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	int* p = arr; //== int* p = &arr[0]
	for (i = 0; i < sz; i++)
	{
		scanf("%d",p+i);         //1 2 3 4 5 6 7 8 9 10
	//  scanf("%d",arr+i);
	}
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(p+i));   //1 2 3 4 5 6 7 8 9 10
	 // printf("%d ", *(arr+i));
	 //	printf("%d ", arr[i]);
	}
	return 0;
}

*(arr+i) <==> arr[i]

小tips:

数组就是数组,是一块连续的空间,可以存放一个或多个数据;

指针变量是一个变量,是可以存放地址的变量;

数组与指针不同,但指针可以访问数组。

3、一维数组传参

#include<stdio.h>
void test(int arr[])
//void test(int * arr)
{
	int sz2 = sizeof(arr) / sizeof(arr[0]);
	printf("sz2=%d\n", sz2);
}
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz1 = sizeof(arr) / sizeof(arr[0]);
	printf("sz1=%d\n", sz1);
	test(arr);
	return 0;    //sz1=10
}                //sz2=1 (x86下)

本质上数组传参传递的是数组首元素的地址

3.1、冒泡排序

核心思想:两两相邻的元素进行比较。不满足顺序就交换,满足就找下一对

【有n个元素,进行n-1趟(一趟解决一个数字)】

//冒泡排序(升序)
#include<stdio.h>
void intput(int arr[],int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		scanf("%d", &arr[i]);
	}
}

void bubble_sort(int* arr, int sz)
{
//确定趟数
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int flag = 1;//假设数组本身满足升序要求
		//每一趟内部比较
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				flag = 0;//不是升序
				//进行交换
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
		if (flag == 1)
		{
			break; //跳出for(i=0;i<sz-1;i++)这个循环
        }
	}
}

void printf_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
int main()
{
	int arr[10] = { 0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	intput(arr, sz); //输入一组数据
	bubble_sort(arr, sz); //进行排序(冒泡升序)
	printf_arr(arr, sz); //打印数组
	return 0;
}

三、二级指针

二级指针变量是用来存放一级指针变量的地址

#include<stdio.h>
int main()
{
int a = 10;
int* pa = &a;      //pa是一级指针变量
int** ppa = &pa;   //ppa是二级指针变量

printf("%d\n",**ppa);  //10

**ppa = 200;
printf("%d\n",a);  //200

return 0;
}

【**ppa == *pa == a】

四、指针数组

指针数组是:存放指针的数组

指针数组的每个元素都是用来存放地址(指针)的,每个元素都是指针类型

如图:

#include<stdio.h>
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 };
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		printf("%d ", *(arr[i])); // 10 20 30 
	}
	return 0;
}
1、指针数组模拟二维数组
#include<stdio.h>
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 2,3,4,5,6 };
	int arr3[] = { 3,4,5,6,7 };
//数组名是数组首元素的地址,类型是int*的,可以存放在parr数组中
	int* parr[3] = { arr1,arr2,arr3 };
	int i = 0;
	int j = 0;
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 5; j++)
		{
			printf("%d ", parr[i][j]);
         //printf("%d ", *(*(parr+i)+j));
		}
		printf("\n");
	}
	return 0;
}

到这里指针理解系列2就结束啦!(未完待续哦)

  • 19
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值